Cod sursa(job #2546602)

Utilizator betybety bety bety Data 14 februarie 2020 12:08:12
Problema Stalpi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("stalpi.in");
ofstream out("stalpi.out");
const int inf=2e9,maxn=1e5;
struct stalp
{
    int x,c,s,d;
};
stalp a[1+maxn];
bool cmp1(stalp aa,stalp bb)
{
    return aa.x<bb.x;
}
bool cmp2(stalp aa,stalp bb)
{
    if(aa.s!=bb.s)
        return aa.s<bb.s;
    return aa.d<bb.d;
}
int lsb(int x)
{
    return x&-x;
}
struct bit
{
    int aib[1+maxn];
    bit(int n=0)
    {
        for(int i=1;i<=n;++i)
            aib[i]=inf;
    }
    void add(int val,int poz,int n)
    {
        while(poz)
        {
            aib[poz]=min(aib[poz],val);
            poz-=lsb(poz);
        }
    }
    int query(int poz,int n)
    {
        int sol;
        sol=inf;
        while(poz<=n)
        {
            sol=min(sol,aib[poz]);
            poz+=lsb(poz);
        }
        return sol;
    }
};
int n;
int getpoz(int xx)
{
    int l,r;
    l=1,r=n;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(a[mid].x>xx)
            r=mid-1;
        else l=mid+1;
    }
    return r;
}
int main()
{
    in>>n;
    for(int i=1;i<=n;++i)
        in>>a[i].x>>a[i].c>>a[i].s>>a[i].d;
    sort(a+1,a+n+1,cmp1);
    for(int i=1;i<=n;++i)
    {
        int xx=a[i].x-a[i].s;
        a[i].s=getpoz(xx);
        xx=a[i].x+a[i].d;
        a[i].d=getpoz(xx);
    }
    bit best(n);
    sort(a+1,a+n+1,cmp2);
    for(int i=1;i<=n;++i)
    {
        int mincost=a[i].c;
        if(a[i].s>0)
            mincost+=best.query(a[i].s,n);
        best.add(mincost,a[i].d,n);
    }
    out<<best.aib[n];
    return 0;
}