Cod sursa(job #137310)

Utilizator raula_sanChis Raoul raula_san Data 17 februarie 2008 11:10:15
Problema Stalpi Scor 40
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.57 kb
#include <queue>
#include <cstdio>
#include <vector>
#include <algorithm>

#define dim 100001
#define inf 0x3f3f3f3f

using namespace std;

int N;

int X[dim];
int C[dim];
int S[dim];
int D[dim];

long long unsigned Cm[dim];

struct stlp
{
	int x;
	int c;
	int s;
	int d;
};

struct comp
{
	bool operator()(stlp i, stlp j)
	{
		return i.x > j.x;
	}
};

priority_queue <stlp, vector <stlp>, comp> Pq;

int Binary(int val)
{
	if(val <= 0) return 0;
	
	int i, step;
	for(step=1; step<=N; step<<=1);
	
	for(i=0; step; step>>=1)
		if(i + step <= N && X[i+step] <= val) i += step;
		
	return i;
}

int main()
{
	freopen("stalpi.in", "rt", stdin);
	freopen("stalpi.out", "wt", stdout);
	
	stlp e;

	int i, j, k, max = 0;	
	for(scanf("%d", &N), i=1; i<=N; ++i)
	{
		scanf("%d %d %d %d", &e.x, &e.c, &e.s, &e.d);
		Pq.push(e);
	}

	i = 0;
	while(Pq.empty() == false)
	{
		e = Pq.top();
		Pq.pop();
		
		++ i;
		X[i] = e.x;
		C[i] = e.c;
		S[i] = e.s;
		D[i] = e.d;
	}

	memset(Cm, inf, sizeof(Cm));
	Cm[0] = 0;
	Cm[1] = C[1];
	
	for(i=2; i<=N && X[i]<=X[1]+D[1]; ++i)
		Cm[i] = C[1];
	
	for(i=2; i<=N; ++i)
	{
		for(j=1; j<i; ++j)
		{
			k = Binary(X[j]-S[j]);
			
			if(X[i] <= X[j] + D[j] && Cm[k] + C[j] < Cm[i])
				Cm[i] = Cm[k] + C[j];
		}
		k = Binary(X[i]-S[i]);
		
		int cst = C[i] + Cm[k];
		
		for(j=k+1; j<=i; ++j)
			if(Cm[j] > cst) Cm[j] = cst;

		for(j=i+1; j<=N && X[j]<=X[i]+D[i]; ++j)
			if(Cm[j] > cst) Cm[j] = cst;
	}
	
	printf("%llu", Cm[N]);

	fclose(stdin);
	fclose(stdout);
	return 0;
}