Cod sursa(job #1104346)

Utilizator TodeaDariustodea darius TodeaDarius Data 10 februarie 2014 18:35:58
Problema Stalpi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
int n,xx,cc,ss,d,c[100005],v[100005],j,k,val[100005],viz[100005];
multiset<int>hp;
struct stalp
{
    int x,nrs;
};
stalp l[100005],r[100005],s[100005];
void citire()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d",&xx,&cc,&ss,&d);
        s[i].x=xx;
        s[i].nrs=i;
        l[i].x=xx-ss;
        l[i].nrs=i;
        r[i].x=xx+d;
        r[i].nrs=i;
        c[i]=cc;
    }
}
bool cmp(stalp a,stalp b)
{
    return a.x<b.x;
}
int main()
{
    freopen("stalpi.in","r",stdin);
    freopen("stalpi.out","w",stdout);

    citire();
    sort(l+1,l+n,cmp);
    sort(r+1,r+n,cmp);
    sort(s+1,s+n,cmp);
    for(int i=1;i<=n;i++)
    {
        j=1;
            while(l[j].x<=s[i].x && j<=n)
            {
                if(viz[l[j].nrs]==0)
                {
                    hp.insert(v[i-1]+c[l[j].nrs]);
                    val[l[j].nrs]=v[i-1]+c[l[j].nrs];
                    viz[l[j].nrs]=1;
                }
                j++;
            }
        k=1;
            while(r[k].x<s[i].x && k<=n)
            {
                hp.erase(hp.find(val[r[k].nrs]));
                viz[r[k].nrs]=0;
                k++;
            }
           v[i]=*hp.begin();
    }
    printf("%d\n",v[n]);
    return 0;
}