Cod sursa(job #586311)

Utilizator VmanDuta Vlad Vman Data 30 aprilie 2011 14:28:00
Problema Avioane Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Open Marime 0.92 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 500001

int N, S[Nmax], i, ph, pl, p, hi, lo, i1, i2;
int Q[Nmax], st, dr;

int main()
{
 freopen("avioane.in","r",stdin);
 freopen("avioane.out","w",stdout);

 scanf("%d", &N);
 for (i=0; i<N; ++i)
	scanf("%d", &S[i]);

 sort(S, S+N);

 ph = pl = 0;
 hi = lo = 0; 
 Q[st=0] = 0;
 dr = 1;
 for (hi=1; hi<N; ++hi)	
	{
	 ph = S[hi] * (N-hi);
	 //scoate din dequeue
	 if (S[hi] != S[lo])
	 {
	  while (st>dr)
		{		 
		 i1 = S[lo] * (hi-lo) / (S[hi]-S[lo]);
		 i2 = S[lo] * (Q[st]-lo) / (S[Q[st]]-S[lo]);
		 if (i2+Q[st] < i1+hi) break;
		 --st;
		}
	  Q[++st] = hi;
	 }
	 if (dr<=st && Q[dr] != hi)
		{
		 i1 = S[lo] * (Q[dr]-lo) / (S[Q[dr]]-S[lo]) + 1;
		 if (i1+Q[dr]<=hi) lo = Q[dr], ++dr;
		}			 
	 //printf("%d %d\n",lo,hi);

	 pl = S[lo] * (hi-lo);

	 if (pl+ph>p) p = pl+ph;
	}

 printf("%d\n", p);

 return 0;
}