Cod sursa(job #291545)

Utilizator tvladTataranu Vlad tvlad Data 29 martie 2009 23:13:05
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int N_MAX = 8;//100000;
const int AI_SIZE = 32;//262144;
const int INF = 0x3f3f3f3f;

struct stalp { int x,c,s,d; };

int n;
stalp v[N_MAX], w[N_MAX];
int d[N_MAX];
int ai[AI_SIZE];

bool comp_1 ( const stalp &a, const stalp &b ) { return a.x < b.x; }
bool comp_2 ( const stalp &a, const stalp &b ) { return a.x + a.d < b.x + b.d; }
bool search_comp ( const stalp &a, const stalp &b ) { return a.x < b.x; }

int query ( int ql, int qr, int nod = 1, int left = 0, int right = n-1 ) {
	if (ql <= left && right <= qr)
		return ai[nod];
	int mid = left + (right-left)/2, q1 = INF, q2 = INF;
	if (ql <= mid) q1 = query(ql, qr, nod << 1, left, mid);
	if (qr > mid) q2 = query(ql, qr, (nod << 1)+1, mid+1, right);
	return min(q1,q2);
}

void update ( int x, int v, int nod = 1, int left = 0, int right = n-1 ) {
	if (left == right) {
		ai[nod] = v;
	} else {
		int mid = left + (right-left)/2;
		if (x <= mid)
			update(x, v, nod << 1, left, mid); else
			update(x, v, (nod << 1)+1, mid+1, right);
		ai[nod] = min(ai[nod << 1], ai[(nod << 1)+1]);
	}
}

int main() {
	freopen("stalpi.in","rt",stdin);
	freopen("stalpi.out","wt",stdout);
	scanf("%d",&n);
	for (int i = 0; i <n; ++i)
		scanf("%d %d %d %d",&v[i].x,&v[i].c,&v[i].s,&v[i].d);
	copy(v,v+n,w);
	sort(v,v+n,comp_1);
	sort(w,w+n,comp_2);
	fill(ai,ai+AI_SIZE,INF);
	fill(d,d+n,INF);

	for (int i = 0; i < n; ++i) {
		stalp what;
		what.x = w[i].x - w[i].s;
		int left = lower_bound(v, v+n, what, search_comp) - v;
		what.x = w[i].x + w[i].d;
		int right = upper_bound(v, v+n, what, search_comp) - v - 1;

		int min = left == 0 ? 0 : query(left,n-1);
		if (left > 0 && d[left-1] < min) min = d[left-1];
		if (min + w[i].c < d[right]) {
			d[right] = min + w[i].c;
			update(right,d[right]);
		}
	}

	printf("%d\n",d[n-1]);
	return 0;
}