Cod sursa(job #277254)

Utilizator alex23alexandru andronache alex23 Data 11 martie 2009 16:46:28
Problema Carnati Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <iostream>
#define NMAX 2150

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], v[NMAX], diff[NMAX];

int swap(int a, int b)
{
	int aux = v[a];
	v[a] = v[b];
	v[b] = aux;

	return 0;
}
int addHeap(int k)
{
	v[k] = k;
	while (a[v[k]].p < a[v[(k - 1) / 2]].p)
	{
		swap(k, (k - 1) / 2);
		k = (k - 1) / 2;
	}

	return 0;
}

int delHeap(int k)
{
	b[k].p = a[v[0]].p;
	b[k].t = a[v[0]].t;

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

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

int main()
{
	fscanf(f, "%lld %lld", &N, &C);
	for (int i = 0; i < N; ++i)
	{
		fscanf(f, "%lld %lld", &a[i].p, &a[i].t);
		addHeap(i);
	}
	fclose(f);

	for (int i = 0; i < N; ++i)
	{
		delHeap(i);
	}
	
	for (int i = 1; i < N; ++i)
	{
		diff[i] = (b[i].p - b[i - 1].p) * C;
	}

	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)
		{
			if (pret - C > 0)
				vector[0] = pret - C;
			else
				vector[0] = 0;
			//vector[0] = maxim(pret - C, 0);
			//max = maxim(vector[0], max);
		}
		else
		{
			vector[0] = 0;
		}

		for (int j = 1; j < N; ++j)
		{
			if (pret <= b[j].t)
			{
				long long x = pret - C, y = vector[j - 1] - diff[j] + pret;
				if (x < y)
					vector[j] = y;
				else
					vector[j] = x;
			}
			else
			{
				long long y = vector[j - 1] - diff[j];
				if (y > 0)
					vector[j] = y;
				else
					vector[j] = 0;
			}
		}
		for (int j = 0; j < N; ++j)
		{
			if (vector[j] > max)
			{
				max = vector[j]; 
			}
		}
	}

	fprintf(g, "%lld", max);
	fclose(g);
	
	return 0;
}