Cod sursa(job #866757)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 28 ianuarie 2013 18:41:04
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<fstream>
#define inf 20000000
#include<algorithm>
#include<cstring>
#define dim 100007

using namespace std;

ifstream f("stalpi.in");
ofstream g("stalpi.out")
;
long A[3*dim],best[dim],i,j,L,R,a[dim],n;

struct cub{
	long st,dr,cost,x;
}
v[dim];

inline long min(long a,long b){
	if(a<b)
		return a;
	return b;
}
long bs1( int val ) {
	
	int st,dr,m,sol;
	st=0;
	dr=n;
	
	while(st<=dr) {
		
		m=(st+dr)/2;
		if(a[m]<val && a[m+1]>=val){
			return m;
		}
	
			
			if(a[m]>=val){
				dr=m-1;
				
			}
			else{
				st=m+1;
				sol=m;
			}
		
		
	}
	return sol;
}
int bs2(int val) {
	
	
	int st,dr,m,sol;
	st=0;dr=n;
	
	while(st<=dr) {
		
		m=(st+dr)/2;
		if(a[m]<=val && a[m+1]>val){
			return m;
		}
			
			if(a[m]>val){
				dr=m-1;
				
			}
			else{
				st=m+1;
				sol=m;
			}
		
		
		
	}
	return sol;
}
int cmp(cub a ,cub b ){
	return a.dr<b.dr;
}
int querry (int nod ,int st ,int dr, int l,int r) {
	long m=(st+dr)/2;
	long ans;
	if(l<=st && dr<=r) {
		return A[nod];
	}
	ans=inf;
	
	if(l<=m)
		ans=min(ans,querry(2*nod,st,m,l,r));
	else
		ans=min(ans,querry(2*nod+1,m+1,dr,l,r));
	
	return ans;
}
void update (int nod ,int st, int dr , int poz , int val ){
	
	long m=(st+dr)/2;
	if(st==dr){
		
		A[nod]=val;
		return ;
	}
	if(poz<=m)
		update(2*nod,st,m,poz,val);
	if(m<poz)
		update(2*nod+1,m+1,dr,poz,val);
	a[nod]=min(a[2*nod],a[2*nod+1]);
	
}
int main () {
	
	f>>n;
	
	for(i=1;i<=n;++i){
		f>>v[i].x>>v[i].cost>>v[i].st>>v[i].dr;
		a[i]=v[i].x;
		v[i].st=v[i].x-v[i].st;
		v[i].dr=v[i].x+v[i].dr;
	}
	//best[i]=costul minim pentru a acoperi primii n stalpi
	
	sort(a+1,a+1+n);
	sort(v+1,v+1+n,cmp);
	
	memset(A,inf,sizeof(A));
	memset(best,inf,sizeof(best));
	update(1,0,n,0,0);
	
	best[0]=0;
	for(i=1;i<=n;++i){
		L=bs1(v[i].st);
		R=bs2(v[i].dr);
		best[R]=min(best[R],querry(1,0,n,L,R)+v[i].cost);
		update(1,0,n,R,best[R]);
	}
	
	g<<best[n]<<"\n";
	
	return 0;
}