Cod sursa(job #1266389)

Utilizator gapdanPopescu George gapdan Data 18 noiembrie 2014 17:56:39
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<cstdio>
#include<algorithm>
#define NMAX 100001
using namespace std;
int n,i;
int v[NMAX],ind[NMAX];
long long cost[NMAX];
long long max(long long a,long long b)
{
    if (a>b) return a;
        else return b;
}
void divide(int st,int dr)
{
    if (st>dr) return;
    int mij=(st+dr)/2;
    for (int i=ind[st-1];i<=ind[dr+1] && i<=mij;++i)
    {
        if (1LL*v[i]*(mij-i+1)>cost[mij])
        {
            cost[mij]=1LL*v[i]*(mij-i+1);
            ind[mij]=i;
        }
    }
    divide(st,mij-1);
    divide(mij+1,dr);
}
int main()
{
    freopen("avioane.in","r",stdin);
    freopen("avioane.out","w",stdout);
    scanf("%d",&n);
    for (i=1;i<=n;++i) scanf("%d",&v[i]);
    sort(v+1,v+n+1);
    ind[n+1]=n;
    divide(1,n);
    long long pmax=0;
    for (i=1;i<=n;++i)
        pmax=max(pmax,1ll*v[i]*(n-i+1)+cost[i-1]);
    printf("%lld\n",pmax);
    return 0;
}