Cod sursa(job #653115)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 27 decembrie 2011 13:34:01
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
#include <algorithm>
#define NMAX 100005
#define INF 2000000000
#define ll long long
using namespace std;
int n,A[NMAX],st[NMAX],inc,sf;
ll B[NMAX],act,rez,win,timp[NMAX];
inline ll max(ll x,ll y)
{
	return x>y ? x : y;
}
ll when(int p1,int i)
{
	if (A[p1]==A[i])
		return INF;
	ll avans=(ll)(i-p1)*A[p1];
	int val=A[i]-A[p1];
	return avans/val+i;
}
int main()
{
	freopen("avioane.in","r",stdin);
	freopen("avioane.out","w",stdout);
	scanf("%d",&n);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d",&A[i]);
	sort(A+1,A+n+1);
	inc=sf=1; st[inc]=1;
	B[1]=A[1];
	for (i=2; i<=n; i++)
	{
		if (inc!=sf && timp[st[inc+1]]==i)
			inc++;
		timp[st[inc]]=i;
		while (sf)
		{
			win=when(st[sf],i);
			if (win<=timp[st[sf]])
				sf--;
			else
				break ;
		}
		st[++sf]=i;
		timp[i]=win;
		B[i]=(ll)A[st[inc]]*(i-st[inc]+1);
	}
	for (i=1; i<=n; i++)
	{
		act=B[i-1]+(ll)A[i]*(n-i+1);
		if (act>rez)
			rez=act;
	}
	printf("%lld\n",rez);
	return 0;
}