Cod sursa(job #2539387)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 5 februarie 2020 20:29:06
Problema Stalpi Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const long long INF = 100000000000000;
const int NMAX = 100005;
struct ABC {
    int x;
    long long c;
    int st, dr;
};
ABC v[NMAX];
bool cmp(ABC first, ABC second) {
    return (first.x < second.x);
}
long long best[NMAX];
long long aint[4 * NMAX];
void update(int nod, int st, int dr, int poz, long long val) {
    if(st == dr) {
        if(val == -1) {
            aint[nod] = INF;
        }
        else {
            aint[nod] = min(aint[nod], val);
        }
        return ;
    }
    int mij = (st + dr) / 2;
    if(poz <= mij) {
        update(2 * nod, st, mij, poz, val);
    }
    else {
        update(2 * nod + 1, mij + 1, dr, poz, val);
    }
    aint[nod] = min(aint[2 * nod], aint[2 * nod + 1]);
}
long long query(int nod, int st, int dr, int x, int y) {
    if(dr < x) {
        return INF;
    }
    if(y < st) {
        return INF;
    }
    if(x <= st && dr <= y) {
        return aint[nod];
    }
    int mij = (st + dr) / 2;
    long long s1 = query(2 * nod, st, mij, x, y);
    long long s2 = query(2 * nod + 1, mij + 1, dr, x, y);
    return min(s1, s2);
}
int cb(int i, int n, bool ok) {
    int st = 1, dr = n, last = i;
    while(st <= dr) {
        int mij = (st + dr) / 2;
        if(ok == 0) {
            if(v[mij].x >= v[i].x - v[i].st) {
                dr = mij - 1;
                last = mij;
            }
            else {
                st = mij + 1;
            }
        }
        else {
            if(v[mij].x <= v[i].x + v[i].dr) {
                st = mij + 1;
                last = mij;
            }
            else {
                dr = mij - 1;
            }
        }
    }
    return last;
}

int main() {
    int n;
    freopen("stalpi.in", "r", stdin);
    freopen("stalpi.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d%lld%d%d", &v[i].x, &v[i].c, &v[i].st, &v[i].dr);
        update(1, 1, n, i, -1);
    }
    sort(v + 1, v + n + 1, cmp);
    for(int i = 1; i <= n; i++) {
        int p1 = cb(i, n, 0);
        int p2 = cb(i, n, 1);
        if(p1 == 1) {
            update(1, 1, n, p2, v[i].c);
        }
        else {
            long long nr = query(1, 1, n, p1 - 1, p2);
            update(1, 1, n, p2, v[i].c + nr);
        }
    }
    printf("%lld\n", query(1, 1, n, n, n));
    return 0;
}