Cod sursa(job #138461)

Utilizator damaDamaschin Mihai dama Data 18 februarie 2008 17:53:24
Problema Stalpi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#include <algorithm>

const int nm = 100001;
const long long inf = (long long) 1 << 56;

using namespace std;

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

struct jeg
{
	int st, dr, cost;
};

pula a[nm];
jeg v[nm];
int n;
long long c[nm];

bool cmp1(pula one, pula two)
{
	return one.x < two.x;
}
bool cmp2(jeg one, jeg two)
{
	return one.dr < two.dr;
}
int bs1(int);
int bs2(int);

int main()
{
	freopen("stalpi.in", "r", stdin);
	freopen("stalpi.out", "w", stdout);

	int i, j;
	long long temp;

	scanf("%d", &n);

	for(i = 1; i <= n; ++i)
	{
		scanf("%d %d %d %d", &a[i].x, &a[i].c, &a[i].s, &a[i].d);
	}
	sort(a + 1, a + n + 1, cmp1);

	for(i = 1; i <= n; ++i)
	{
		v[i].st = bs1(a[i].x - a[i].s);
		v[i].dr = bs2(a[i].x + a[i].d);
		v[i].cost = a[i].c;
	//	printf("%d %d %d\n", v[i].st, v[i].dr, v[i].cost);
		c[i] = inf;
	}

	sort(v + 1, v + n + 1, cmp2);

	for(i = 1; i <= n; ++i)
	{
		temp = inf;
		for(j = v[i].st - 1; j < v[i].dr; ++j)
		{
			if(temp > c[j])
			{
				temp = c[j];
			}
		}
		if(c[v[i].dr] > temp + v[i].cost)
		{
			c[v[i].dr] = temp + v[i].cost;
		}
	}

	printf("%lld\n", c[n]);

	return 0;
}

int bs1(int val)
{
	int min = 1, mid, max = n, rez;

	while(min <= max)
	{
		mid = (min + max) / 2;
		if(a[mid].x >= val)
		{
			rez = mid;
			max = mid - 1;
		}
		else
		{
			min = mid + 1;
		}
	}
	return rez;
}

int bs2(int val)
{
	int min = 1, mid, max = n, rez;

	while(min <= max)
	{
		mid = (min + max) / 2;
		if(a[mid].x <= val)
		{
			rez = mid;
			min = mid + 1;
		}
		else
		{
			max = mid - 1;
		}
	}
	return rez;
}