Cod sursa(job #1173552)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 20 aprilie 2014 00:36:20
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
// v[i] = x => pozitia x asigura profit maxim daca de la i la x avem clasa a doua,
// iar de la i+1 la n avem clasa intai

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int nmax = 100005;
int n,i,a[nmax],v[nmax];
ll best[nmax],sol;
void solve(int l,int r)
{
    if(l>r) return;
    int m=(l+r)/2;
    for(int i=v[l-1];i<=v[r+1];i++)
    {
        ll aux=1LL*(m-i+1)*a[i];
        if(aux>best[m])
        {
            best[m]=aux;
            v[m]=i;
        }
    }
    solve(l,m-1);
    solve(m+1,r);
}
int main()
{
	freopen("avioane.in","r",stdin);
	freopen("avioane.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++) scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	v[0]=0; v[n+1]=n;
	solve(1,n);
	for(i=1;i<=n;i++)
        if(a[i]!=a[i+1])
            sol=max(sol,best[i]+1LL*(n-i)*a[i+1]);
    printf("%lld\n",sol);
	return 0;
}