Cod sursa(job #587477)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 4 mai 2011 22:25:46
Problema Avioane Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 100010
#define ll long long
#define inf 1000000

int n, v[nmax], q[nmax], r;
ll a[nmax], sol;

int main()
{
	freopen("avioane.in","r",stdin);
	freopen("avioane.out","w",stdout);
	scanf("%d", &n);
	int i, d, st, dr, j;
	ll x;
	for (i=1; i<=n; i++) scanf("%d", &v[i]);
	sort (v+1, v+n+1);
	for (i=1; i<=n; i++) a[i]=(ll) v[i]*(n-i+1);
	st=1;
	dr=0;
	r=0;
	for (i=1; i<=n; i++)
	{
		while (st<dr)
		{
			d=q[dr]-q[st]+1;
			x=(ll) v[q[st]]*d;
			if (v[q[st]]==v[q[dr]]) r=inf; else
			if (x<=v[q[dr]]) r=-1; else
			{
				x-=v[q[dr]];
				r=x/(v[q[dr]]-v[q[st]]);
				if (x%(v[q[dr]]-v[q[st]])) r++;
				r+=q[dr];
			}
			if (r==-1 || r<=i) st++; else break;
		}
		r=0;
		while (st<=dr)
		{
			d=i-q[dr]+1;
			x=(ll) v[q[dr]]*d;
			if (v[q[dr]]==v[i]) r=inf; else
			if (x<=v[i]) r=-1; else
			{
				x-=v[i];
				r=x/(v[i]-v[q[dr]]);
				if (x%(v[i]-v[q[dr]])) r++;
				r+=i;
			}
			if (r==-1) dr--; else break;
		}
		if (r!=inf) q[++dr]=i;
		if ((ll) v[q[st]]*(i-q[st]+1)+a[i+1]>sol) sol=(ll) v[q[st]]*(i-q[st]+1)+a[i+1];
	}
	printf("%lld\n",sol);
}