Cod sursa(job #322698)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 9 iunie 2009 17:27:46
Problema Carnati Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<stdio.h>    
#include<string.h>
struct point
{
	int x,y;
};
int n,c;
point v[2002];

void read()
{
	freopen("carnati.in","r",stdin);
	freopen("carnati.out","w",stdout);
	scanf("%d%d",&n,&c);
	int i;
	for(i=1;i<=n;i++)
		scanf("%d%d",&v[i].x,&v[i].y);
}

int part(int st, int dr)
{
	int i,j,m;
	point aux,p;
	m=(st+dr)>>1;
	p=v[m];
	i=st-1;
	j=dr+1;
	while(1)
	{
		do{++i;}while(v[i].x<p.x);
		do{--j;}while(v[j].x>p.x);
		if(i<j)
		{
			aux=v[i];
			v[i]=v[j];
			v[j]=aux;
		}
		else
			return j;
	}
}

void quick(int st, int dr)
{
	int p;
	if(st<dr)
	{
		p=part(st,dr);
		quick(st,p);
		quick(p+1,dr);
	}
}

inline int max(int a, int b)
{
	if(a>b)
		return a;
	return b;
}

void rez()
{
	int i,j,a[2002],g,maxim=0;
	a[0]=v[0].x=-10;
	for(j=1;j<=n;j++)
	{
		memset(a,0,sizeof(a));
		for(i=1;i<=n;i++)
		{
			if(v[j].y<=v[i].y)
				g=v[j].y;
			else
				g=0;
			a[i]=max(a[i-1]-(v[i].x-v[i-1].x)*c+g,g-c);
			if(a[i]>maxim)
				maxim=a[i];
		}
	}
	printf("%d\n",maxim);
}

int main()
{
	read();
	quick(1,n);
	rez();
	return 0;
}