Cod sursa(job #1746203)

Utilizator akaprosAna Kapros akapros Data 22 august 2016 19:54:03
Problema Stalpi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
#define maxN 100002
#define zeros(x) x & (-x)
using namespace std;
int n, a[maxN], aib[maxN];
struct pillar
{
    int x, y, c, p;
} v[maxN];

int cmp(const pillar a, const pillar b)
{
    return a.y < b.y;
}
int Min(int x)
{
    if (x < 1)
        return 0;
    int i, ans = aib[x];
    for (i = x; i <= n; i += zeros(i))
        if (aib[i] < ans)
            ans = aib[i];
    return ans;
}
void upd(int x, int val)
{
    int i;
    for (i = x; i >= 1; i -= zeros(i))
        if (aib[i] > val)
            aib[i] = val;
}
int bs(int x)
{
    int i = 0, p = 1 << 16;
    while (p)
    {
        if (i + p <= n && a[i + p] <= x)
            i += p;
        p >>= 1;
    }
    return i;
}
void read()
{
    int i;
    freopen("stalpi.in", "r", stdin);
    scanf("%d", &n);
    for (i = 1; i <= n; ++ i)
    {
        int x, l, r;
        scanf("%d %d %d %d", &x, &v[i].c, &l, &r);
        v[i].x = x - l;
        v[i].y = x + r;
        a[i] = x;
    }
}
void solve()
{
    int i;
    sort(v + 1, v + n + 1, cmp);
    sort(a + 1, a + n + 1);
    memset(aib, 0x3f, sizeof(aib));

    for (i = 1; i <= n; ++ i)
    {
        int l = bs(v[i].x), r = bs(v[i].y);
        int cost = Min(l) + v[i].c;
        upd(r, cost);
    }
}
void write()
{
    freopen("stalpi.out", "w", stdout);
    printf("%d\n", aib[n]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}