Submission #121470

#TimeUsernameProblemLanguageResultExecution timeMemory
121470TadijaSebezSalesman (IOI09_salesman)C++11
100 / 100
824 ms33080 KiB
#include <stdio.h>
#include <algorithm>
using namespace std;
struct Fair
{
	int t,x,Value;
	int id;
	int i;
	int Best;
	int CurBest;
	int LowBest;
	inline bool operator < (const Fair &b) const
	{
		if(t<b.t) return true;
		if(t==b.t && x<b.x) return true;
		return false;
	}
} Fairs[500040];
bool Compare1(Fair a, Fair b)
{
	if(a.x<b.x) return true;
	return false;
}
const int Max_N=1<<19;
const int inf=1000000000;
int SegmentTree[2][Max_N*2+20];
int max(int a, int b)
{
	if(a>b) return a;
	else return b;
}
void Initialize(int st)
{
	int i;
	for(i=0;i<Max_N*2+5;i++)
		SegmentTree[st][i]=-inf;
}
void Set(int st, int index, int value)
{
	int x=Max_N+index;
	SegmentTree[st][x]=value;
	x/=2;
	while(x>0)
	{
		SegmentTree[st][x]=max(SegmentTree[st][x*2],SegmentTree[st][x*2+1]);
		x/=2;
	}
}
int Get(int st, int ss, int se, int si, int qs, int qe)
{
	if(ss>qe || se<qs) return -inf;
	if(ss>=qs && se<=qe) return SegmentTree[st][si];
	int mid=(ss+se)>>1;
	return max(Get(st,ss,mid,si*2,qs,qe),Get(st,mid+1,se,si*2+1,qs,qe));
}
int Get(int st, int qs, int qe)
{
	return Get(st,0,Max_N-1,1,qs,qe);
}
int main()
{
	int n,u,d,s,i,j;
	scanf("%i %i %i %i",&n,&u,&d,&s);
	Fairs[0].t=-1;
	Fairs[0].x=s;
	Fairs[0].Value=0;
	Fairs[0].i=0;
	int maxt=0;
	for(i=1;i<=n;i++)
	{
		scanf("%i %i %i",&Fairs[i].t,&Fairs[i].x,&Fairs[i].Value);
		maxt=max(maxt,Fairs[i].t);
		Fairs[i].i=1;
	}
	Fairs[n+1].t=maxt+1;
	Fairs[n+1].x=s;
	Fairs[n+1].Value=0;
	Fairs[n+1].i=n+1;
	n+=2;
	sort(Fairs,Fairs+n,Compare1);
	for(i=0;i<n;i++)
	{
		Fairs[i].id=i;
	}
	sort(Fairs,Fairs+n);
	Initialize(0);
	Initialize(1);
	Set(0,Fairs[0].id,d*Fairs[0].x);
	Set(1,Fairs[0].id,-u*Fairs[0].x);
	for(i=1;i<n;i++)
	{
		if(Fairs[i].t!=Fairs[i+1].t)
		{
			Fairs[i].Best=max(Get(0,0,Fairs[i].id-1)-d*Fairs[i].x,
					Get(1,Fairs[i].id+1,n)+u*Fairs[i].x)+Fairs[i].Value;
			Set(0,Fairs[i].id,Fairs[i].Best+d*Fairs[i].x);
			Set(1,Fairs[i].id,Fairs[i].Best-u*Fairs[i].x);
		}
		else
		{
			int first=i;
			int last;
			while(Fairs[i].t==Fairs[i+1].t)
				i++;
			last=i;
			for(j=first;j<=last;j++)
			{
				Fairs[j].LowBest=max(Get(0,0,Fairs[j].id-1)-d*Fairs[j].x,
					Get(1,Fairs[j].id+1,n)+u*Fairs[j].x)+Fairs[j].Value;
				Fairs[j].Best=Fairs[j].LowBest;
			}
			Fairs[first].CurBest=Fairs[first].LowBest;
			Fairs[first].Best=Fairs[first].CurBest;
			for(j=first+1;j<=last;j++)
			{
				int val=Fairs[j-1].CurBest-(Fairs[j].x-Fairs[j-1].x)*d+Fairs[j].Value;
				Fairs[j].CurBest=max(val,Fairs[j].LowBest);
				Fairs[j].Best=max(Fairs[j].Best,Fairs[j].CurBest);
			}
			Fairs[last].CurBest=Fairs[last].LowBest;
			Fairs[last].Best=max(Fairs[last].Best,Fairs[last].CurBest);
			for(j=last-1;j>=first;j--)
			{
				int val=Fairs[j+1].CurBest-(Fairs[j+1].x-Fairs[j].x)*u+Fairs[j].Value;
				Fairs[j].CurBest=max(val,Fairs[j].LowBest);
				Fairs[j].Best=max(Fairs[j].Best,Fairs[j].CurBest);
			}
			for(j=first;j<=last;j++)
			{
				Set(0,Fairs[j].id,Fairs[j].Best+d*Fairs[j].x);
				Set(1,Fairs[j].id,Fairs[j].Best-u*Fairs[j].x);
			}
		}
	}
	if(Fairs[n-1].Best<0) printf("0\n");
	else printf("%i\n",Fairs[n-1].Best);
	return 0;
}

Compilation message (stderr)

salesman.cpp: In function 'int main()':
salesman.cpp:63:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i %i %i",&n,&u,&d,&s);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
salesman.cpp:71:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%i %i %i",&Fairs[i].t,&Fairs[i].x,&Fairs[i].Value);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...