Cod sursa(job #587736)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 5 mai 2011 19:08:17
Problema Avioane Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 100010
#define ll long long
#define inf 1000000

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

int calc(int i, int j)
{
	int r, d=j-i+1;
	ll x=(ll) v[i]*d;
	if (v[i]==v[j]) r=inf; else
	if (x<=v[j]) r=-1; else
	{
		x-=v[j];
		r=x/(v[j]-v[i]);
		if (x%(v[j]-v[i])) r++;
		r+=j;
	}
	return r;
}
		
int main()
{
	freopen("avioane.in","r",stdin);
	freopen("avioane.out","w",stdout);
	scanf("%d", &n);
	int i, st, dr, 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;
	for (i=1; i<=n; i++)
	{
		while (st<dr && calc(q[st], q[st+1])<=i) st++;
		while (st<=dr)
		{
			x=calc(q[dr], i);
			if (x==-1) dr--; else
			if (st<dr && x>calc(q[dr-1], i)) dr--; else break;
		}
		if (x!=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);
}