Cod sursa(job #315879)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 17 mai 2009 16:27:32
Problema Stalpi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include<stdio.h> 
#include<utility>
#include<algorithm>
#include<vector>
#define dv 100010
using namespace std;
struct nod{int a,b;long long U,D;nod *f1,*f2;};
nod *root;
vector< pair< int,long long > > pd[dv];
int n,i,A,B;
long long INF=1,C,get_min(nod *q),best[dv];
void readd(),solve(),build_arb(nod *nod,int aa,int bb),upd(nod *q);
int main()   
{   
    readd();   
    solve();   
    return 0;   
}   
void readd()   
{
	int x[dv],s[dv],d[dv],yes,no,maybe;
	long long c[dv];
	pair<int,long long> per;
	vector< pair< int,long long > >::iterator it;
	freopen("stalpi.in","r",stdin);   
    freopen("stalpi.out","w",stdout);   
    scanf("%d",&n);   
    for(i=1;i<=n;i++)   
    {   
        scanf("%d%lld%d%d",&x[i],&c[i],&s[i],&d[i]);
		s[i]=x[i]-s[i];d[i]=x[i]+d[i];INF+=c[i];
	}
	sort(x+1,x+n+1);
	for(i=1;i<=n;i++)
	{
		if(s[i]<=x[1])yes=1;
		else 
		{
			no=1;yes=n;
			while(yes-no>1)
			{
				maybe=(yes+no)/2;
				if(s[i]>x[maybe])no=maybe;
				else yes=maybe;
			}
		}
		s[i]=yes;
		if(d[i]>=x[n])yes=n;
		else
		{
			no=n;yes=1;
			while(no-yes>1)
			{
				maybe=(yes+no)/2;
				if(d[i]>=x[maybe])yes=maybe;
				else no=maybe;
			}
		}
		per.first=s[i];
		per.second=c[i];
		pd[yes].push_back(per);
	}
	/*debug
	for(i=1;i<=n;i++)
	{
		printf("Becuri care acopera pozitii pana la %d:\n",i);
		for(it=pd[i].begin();it!=pd[i].end();it++)
		{
			printf("    incepand din pozitia %d\n",(*it).first);
			printf("    cu costul %lld\n",(*it).second);
		}
	}*/
}   
void solve()   
{
	vector< pair< int,long long > >::iterator it;
	int j;
	//nod *q;
	//root=new nod;
	//build_arb(root,0,n);
	//for(q=root;q->f1;q=q->f1)q->D=0;
	//q->U=q->D=0;
	for(i=1;i<=n;i++)
	{
		best[i]=INF;
		for(it=pd[i].begin();it!=pd[i].end();it++)
		{
			A=(*it).first-1;B=i;
			C=INF;
			for(j=A;j<B;j++)if(best[j]<C)C=best[j];
			C+=(*it).second;
			if(C<best[i])best[i]=C;
		}
	}
	printf("%lld\n",best[n]);
}
/*
void build_arb(nod *q,int aa,int bb)
{
	int mm;nod *p;
	q->a=aa;q->b=bb;
	q->U=INF=q->D=INF;
	if(aa==bb){q->f1=q->f2=0;return;}
	mm=(aa+bb)/2;
	p=new nod;build_arb(p,aa,mm);q->f1=p;
	p=new nod;build_arb(p,mm+1,bb);q->f2=p;
}
long long get_min(nod *q)
{
	long long m1,m2;
	if(q->a>B)return INF;
	if(A>q->b)return INF;
	if(A<=q->a&&q->b<=B)return q->D;
	m1=get_min(q->f1);
	m2=get_min(q->f2);
	return m1<m2?m1:m2;
}
void upd(nod *q)
{
	if(q->a>i)return;
	if(q->b>i){upd(q->f1);upd(q->f2);return;}
	if(C>=q->U)return;
	if(C<=q->D){q->U=q->D=C;return;}
	upd(q->f1);upd(q->f2);
}*/