Cod sursa(job #2017562)

Utilizator LucianTLucian Trepteanu LucianT Data 1 septembrie 2017 17:32:14
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <bits/stdc++.h>
using namespace std;
const int maxN=1e5+4;
const int INF=1LL<<60;
int p[maxN];
long long leftsum[maxN];
int n,v[maxN];

void divimp(int st,int dr)
{
    if(st>dr)
        return;

    int mij=st+(dr-st)/2;
    leftsum[mij]=-INF;

    int lim=min(mij,p[dr+1]);

    for(int i=p[st-1];i<=lim;i++)
        if(leftsum[mij]<1LL*(mij-i+1)*v[i]){
            leftsum[mij]=1LL*(mij-i+1)*v[i];
            p[mij]=i;
        }

    divimp(st,mij-1);
    divimp(mij+1,dr);
}
int main()
{
    freopen("avioane.in","r",stdin);
    freopen("avioane.out","w",stdout);

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);

    sort(v+1,v+n+1);
    p[n+1]=n;
    divimp(1,n);

    long long sol=0;
    for(int i=0;i<=n;i++)
        sol=max(sol,leftsum[i]+1LL*(n-i)*v[i+1]);

    printf("%lld",sol);
    return 0;
}