Cod sursa(job #273529)

Utilizator alex23alexandru andronache alex23 Data 8 martie 2009 18:33:33
Problema Carnati Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3 kb
#include <iostream>
#define NMAX 2005

using namespace std;

struct carnat{
	long long t, p;
};

carnat a[NMAX], b[NMAX];

FILE *f = fopen("carnati.in", "r"), *g = fopen("carnati.out", "w");

long long N, C, vector[NMAX];

long long add(long long x, long long y, long long k)
{
	a[k].p = x;
	a[k].t = y;
	while (a[k].p < a[(k - 1) / 2].p)
	{
		int aux = a[k].p;
		a[k].p = a[(k - 1) / 2].p;
		a[(k - 1) / 2].p = aux;
		aux = a[k].t;
		a[k].t = a[(k - 1) / 2].t;
		a[(k - 1) / 2].t = aux;
		k = (k - 1) / 2;
	}

	return 0;
}

long long del(long long k)
{
	b[k].p = a[0].p;
	b[k].t = a[0].t;


	a[0].p = a[N - k - 1].p;
	a[0].t = a[N - k - 1].t;
	int i = 0;
	while ((2 * i + 2 <= N - k - 2) && ((a[i].p > a[2 * i + 1].p) || (a[i].p > a[2 * i + 2].p)))
	{
		if ((a[i].p > a[2 * i + 1].p) && (a[i].p > a[2 * i + 2].p))
		{
			if (a[2 * i + 1].p > a[2 * i + 2].p)
			{
				long long aux = a[2 * i + 2].p;
				a[2 * i + 2].p = a[i].p;
				a[i].p = aux;
				aux = a[2 * i + 2].t;
				a[2 * i + 2].t = a[i].t;
				a[i].t = aux;
				i = 2 * i + 2;
			}
			else
			{
				long long aux = a[2 * i + 1].p;
				a[2 * i + 1].p = a[i].p;
				a[i].p = aux;
				aux = a[2 * i + 1].t;
				a[2 * i + 1].t = a[i].t;
				a[i].t = aux;
				i = 2 * i + 1;
			}
		}
		else
		{
			if (a[i].p > a[2 * i + 1].p)
			{
				long long aux = a[2 * i + 1].p;
				a[2 * i + 1].p = a[i].p;
				a[i].p = aux;
				aux = a[2 * i + 1].t;
				a[2 * i + 1].t = a[i].t;
				a[i].t = aux;
				i = 2 * i + 1;
			}
			else
			{
				long long aux = a[2 * i + 2].p;
				a[2 * i + 2].p = a[i].p;
				a[i].p = aux;
				aux = a[2 * i + 2].t;
				a[2 * i + 2].t = a[i].t;
				a[i].t = aux;
				i = 2 * i + 2;
			}
		}
	}
	if ((2 * i + 1 <= N - k - 2) && (a[i].p > a[2 * i + 1].p))
	{
		long long aux = a[2 * i + 1].p;
		a[2 * i + 1].p = a[i].p;
		a[i].p = aux;
		aux = a[2 * i + 1].t;
		a[2 * i + 1].t = a[i].t;
		a[i].t = aux;
		i = 2 * i + 1;
	}

	return 0;
}

long long maxim(long long a, long long b, long long c)
{
	if (a < b)
	{
		if (b < c)
		{
			return c;
		}
		return b;
	}
	if (a < c)
		return c;
	return a;
}

int main()
{
	fscanf(f, "%d %d", &N, &C);
	for (long long i = 0; i < N; ++i)
	{
		long long x, y;
		fscanf(f, "%lld %lld", &x, &y);
		add(x, y, i);
	}
	fclose(f);

	for (long long i = 0; i < N; ++i)
	{
		del(i);
	}

	long long max = 0;
	for (int i = 0; i < N; ++i)
	{
		//pretul stabilit este b[i].t
		long long pret = b[i].t;
		if (pret <= b[0].t)
		{
			vector[0] = maxim(pret - C, 0, 0);
		}
		else
		{
			vector[0] = 0;
		}

		for (int j = 1; j < N; ++j)
		{
			if (pret <= b[j].t)
			{
				vector[j] = maxim(pret - C, vector[j - 1] - ((b[j].p - b[j - 1].p) * C) + pret, 0);
			}
			else
			{
				vector[j] = maxim(0, vector[j - 1] - (b[j].p - b[j - 1].p) * C, 0);
			}
		}

		for (int j = 0; j < N; ++j)
		{
			if (vector[j] > max)
			{
				max = vector[j]; 
			}
		}
	}

	fprintf(g, "%lld", max);
	fclose(g);


	return 0;
}