Cod sursa(job #139276)

Utilizator dominoMircea Pasoi domino Data 19 februarie 2008 21:32:58
Problema Stalpi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_N 100005
#define FIN "stalpi.in"
#define FOUT "stalpi.out"
#define LSB(x) (((x)&((x)-1))^(x))
#define f first
#define s second
#define mp make_pair

int N, X[MAX_N], cnt[MAX_N], cost[MAX_N], T[MAX_N], Res = 0x3f3f3f3f;
pair<pair<int, int>, int> A[MAX_N];

int query(int x)
{
    int ret;

    if (x < 0) return 0;
    for (x = N-x; x > 0; x -= LSB(x))
        ret = min(ret, T[x]);
    return ret;
}

void update(int x, int y)
{
    for (x = N-x; x <= N; x += LSB(x))
        T[x] = min(T[x], y);
}

int main(void)
{
    int i, x, c, l, r;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d", &N);
    for (i = 0; i < N; ++i)
    {
        scanf("%d %d %d %d", &x, &c, &l, &r);
        A[i] = mp(mp(x+r, x-l), c);
        X[i] = x;
    }

    sort(X, X+N);
    sort(A, A+N);
    memset(T, 0x3f, sizeof(T));
    for (i = 0; i < N; ++i)
    {
        r = A[i].f.f, l = A[i].f.s, c = A[i].s;
        l = lower_bound(X, X+N, l)-X;
        r = upper_bound(X, X+N, r)-X-1;
        cnt[i] = r;
        cost[i] = query(l-1)+c;
        update(r, cost[i]);
        if (cnt[i] == N-1) Res = min(Res, cost[i]);
    }
    printf("%d\n", Res);

    return 0;
}