Cod sursa(job #2340284)

Utilizator AndraMihailescuAndra Maria Elena Mihailescu AndraMihailescu Data 10 februarie 2019 10:50:18
Problema Avioane Scor 70
Compilator cpp-64 Status done
Runda simulareinfo1_9 Marime 0.84 kb
#include <bits/stdc++.h>
using namespace std;
const int maxN=1e5+4;
const int INF=1<<30;
int p[maxN];
int 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]<(mij-i+1)*v[i]){
            leftsum[mij]=(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);

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

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