Cod sursa(job #1779145)

Utilizator killer301Ioan Andrei Nicolae killer301 Data 14 octombrie 2016 20:52:15
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
#include <algorithm>

typedef long long LL;

using namespace std;

const int NMAX = 100000;
const LL inf = 2000000000000000000LL;

int n;
int a[NMAX+5], p[NMAX+5];
LL ans, best[NMAX+5];

void Solve(int st, int dr)
{
    int mid = (st+dr)/2;
    best[mid] = -inf;
    for(int i=p[st-1]; i<=p[dr+1]; i++)
    {
        if(best[mid]>=1LL*(mid-i+1)*a[i] || i>mid) continue;
        best[mid]=1LL*(mid-i+1)*a[i]; p[mid]=i;
    }
    if(st<mid) Solve(st, mid-1);
    if(dr>mid) Solve(mid+1, dr);
}

int main()
{
    freopen("avioane.in",  "r",  stdin);
    freopen("avioane.out",  "w",  stdout);
    scanf("%d",  &n);
    p[n+1]=n;
    for(int i=1; i<=n; i++)
        scanf("%d",  &a[i]);
    sort(a+1, a+n+1);
    Solve(1, n);
    for(int i=0; i<=n; i++)
        ans=max(ans, best[i] + 1LL*(n-i)*a[i+1]);
    printf("%lld\n", ans);
    return 0;
}