Cod sursa(job #2162980)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 12 martie 2018 16:19:00
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <algorithm>

using namespace std;

pair<int,int> q[1030];
int d[600],R,r[600],f[600];
char vaz[600];

void update(int poz)
{
    for(int i=R-r[poz];i>=0;i--)
        d[i+r[poz]]=max(d[i+r[poz]],d[i]+f[poz]);
}

int main()
{
    freopen("praslea.in","r",stdin);
    freopen("praslea.out","w",stdout);
    int l=0,x,y,n;
    scanf("%d%d",&n,&R);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d",&x,&y,&f[i],&r[i]);
        q[++l]={x,i};
        q[++l]={y+1,-i};
    }
    sort(q+1,q+l+1);
    q[0]=q[1];
    long long sol=0;
    int poz1=0,poz=1,val=0;
    while(poz<=l)
    {
        sol+=1LL*val*(q[poz].first-poz1);
        poz1=q[poz].first;
        int lim=poz+1;
        while(lim<=l && q[lim].first==q[poz].first) lim++;
        lim--;
        int p=0;
        for(;poz<=lim;poz++)
            if(q[poz].second<0) vaz[-q[poz].second]=0,p=1;
            else break;
        if(p==1)
        {
            for(int i=0;i<=R;i++) d[i]=0;
            for(int i=1;i<=n;i++)
                if(vaz[i]==1) update(i);
        }
        for(;poz<=lim;poz++)
        {
            update(q[poz].second);
            vaz[q[poz].second]=1;
        }
        val=0;
        for(int i=0;i<=R;i++) val=max(val,d[i]);
    }
    printf("%lld",sol);
    return 0;
}