Cod sursa(job #315783)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 17 mai 2009 12:11:53
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<stdio.h> 
#include<utility>
#include<algorithm>
#define ll long long
#define dr first
#define st second.first
#define co second.second
#define dv 100010
using namespace std;
typedef pair<int,pair<int,ll> > bec;
bec b[dv];
int n,i,x[dv],cate[dv],top,ac,it,ic,stg;
ll bst[dv],best,INF;
void readd(),solve(),getsd(),upd_best();
int main()   
{   
    readd();   
    solve();   
    return 0;   
}   
void readd()   
{
	int xx,ss,dd;ll cc;
	freopen("stalpi.in","r",stdin);   
    freopen("stalpi.out","w",stdout);   
    scanf("%d",&n);INF=1;   
    for(i=1;i<=n;i++)   
    {   
        scanf("%d%lld%d%d",&xx,&cc,&ss,&dd);   
        b[i].dr=xx+dd;b[i].st=xx-ss;b[i].co=cc;
		x[i]=xx;INF+=cc;
    }   
}   
void solve()   
{
	sort(x+1,x+n+1);
    for(i=1;i<=n;i++)getsd();   
	sort(b+1,b+n+1);
	top=1;bst[1]=0;cate[1]=0;
	it=1;
	for(ac=1;ac<=n;ac++)
	{
		if(b[it].dr!=ac)continue;
		best=INF;
		while(b[it].dr==ac&&b[it].st<=cate[top]+1)upd_best();
		if(best<INF)
		{
			if(best==bst[top])cate[top]=ac;
			else {top++;cate[top]=ac;bst[top]=best;}
		}
		while(b[it].dr==ac)it++;
	}
	printf("%lld\n",bst[top]);
}   
void getsd()   
{   
    int pr,ul,mi;   
    pr=0;ul=n;   
    while(ul-pr-1)   
    {   
        mi=(ul+pr)>>1;   
        if(b[i].st<=x[mi])ul=mi;   
        else pr=mi;   
    }   
    b[i].st=ul;   
    pr=1;ul=n+1;   
    while(ul-pr-1)   
    {   
        mi=(ul+pr)>>1;   
        if(b[i].dr>=x[mi])pr=mi;   
        else ul=mi;   
    }   
    b[i].dr=pr;
    	
}   
void upd_best()
{
	int lo,up,mi;ll best1;
	lo=0;up=top;
	while(up-lo-1)
	{
		mi=(up+lo)/2;
		if(b[it].st<=cate[mi]+1)up=mi;
		else lo=mi;
	}
	best1=b[it].co+bst[up];
	best=(best<best1)?best:best1;
	it++;
}