Cod sursa(job #315770)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 17 mai 2009 11:13:18
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 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
#define INF 2000000000000LL
using namespace std;
typedef pair<int,pair<int,ll> > bec;
bec b[dv];
int n,i,x[dv],cate[dv],top,ac,it,stg,cauta(int nr);
ll bst[dv],best;
void readd(),solve(),getsd();
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);   
    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;
    }   
}   
void solve()   
{
	sort(x+1,x+n+1);
    for(i=1;i<=n;i++)getsd();   
	sort(b+1,b+n+1);
	for(i=1;i<=n;i++)b[i].st=b[i].dr-b[i].st+1;
	top=1;bst[1]=0;cate[1]=0;
	it=1;
	for(ac=1;ac<=n;ac++)
	{
		if(b[it].dr>ac)continue;
		if(b[it].st+cate[top]<ac)
			{ while(b[it].dr==ac)it++;continue;}
		best=INF;stg=1;
		while(b[it].dr==ac&&b[it].st+cate[top]>=ac)
		{   if(stg<top)stg=cauta(b[it].st);
			if(bst[stg]+b[it].co<best)best=bst[stg]+b[it].co;
			it++;
		}
		if(best>bst[top]){bst[++top]=best;cate[top]=ac;}
		else cate[top]=ac;
		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=0;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;
    	
}   
int cauta(int nr)
{
	int lo=0,up=top,mi;
	while(up-lo-1)
	{
		mi=(up+lo)/2;
		if(cate[mi]+nr<ac)lo=mi;
		else up=mi;
	}
	return up;
}