Cod sursa(job #139084)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 19 februarie 2008 18:17:24
Problema Carnati Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<stdio.h>
long int n,c,i,j,t[2001],p[2001],p1[2001],poz[2001],aux,pf,ok[2001],
profit[2001],profitsol;
void hd(long int ic,long int nc);
void sh(long int i1,long int i2);
void hdp(long int ic,long int nc);
void shp(long int i1,long int i2);
int main()
{
	FILE *f=freopen("carnati.in","r",stdin),*g=freopen("carnati.out","w",stdout);
	scanf("%ld%ld",&n,&c);
	for(i=1;i<=n;i++)fscanf(f,"%ld%ld",&t[i],&p[i]);
	for(i=n/2;i>=1;i--)hd(i,n);
	for(i=n;i>=1;i--){sh(1,i);hd(1,i-1);}
	for(i=1;i<=n;i++){p1[i]=p[i];poz[i]=i;}
	for(i=n/2;i>=1;i--)hdp(i,n);
	for(i=n;i>=1;i--){shp(1,i);hdp(1,i-1);}
	for(i=n;i>=1;i--)
	{ pf=p1[i];ok[poz[i]]=1;
	  while(p1[i-1]==pf){i--;ok[poz[i]]=1;}
	  for(j=1;j<=n;j++)
	   {  if(profit[j-1]+c>(t[j]-t[j-1])*c)
	       profit[j]=profit[j-1]-(t[j]-t[j-1])*c+ok[j]*pf;
	      else
	       profit[j]=ok[j]*pf-c;
	      profitsol=(profitsol>profit[j])?profitsol:profit[j];
	   }
	}
	printf("%ld",profitsol);
	fcloseall();
	return 0;
}
void hd(long int ic,long int nc)
{
	long int is,is1;
	is=2*ic;is1=is+1;
	if(is>nc)return;
	if(is<nc)if(t[is1]>t[is])is=is1;
	if(t[is]>t[ic]){sh(is,ic);hd(is,nc);}
}
void sh(long int i1,long int i2)
{
	aux=t[i1];t[i1]=t[i2];t[i2]=aux;
	aux=p[i1];p[i1]=p[i2];p[i2]=aux;
}
void hdp(long int ic,long int nc)
{
	long int is,is1;
	is=2*ic;is1=is+1;
	if(is>nc)return;
	if(is<nc)if(p1[is1]>p1[is])is=is1;
	if(p1[is]>p1[ic]){shp(is,ic);hdp(is,nc);}
}
void shp(long int i1,long int i2)
{
	aux=p1[i1];p1[i1]=p1[i2];p1[i2]=aux;
	aux=poz[i1];poz[i1]=poz[i2];poz[i2]=aux;
}