Cod sursa(job #1233762)

Utilizator nicolaegutaNicolae Guta nicolaeguta Data 25 septembrie 2014 23:19:10
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

int N,a[Nmax],dq[Nmax],st,dr,t[Nmax];
long long dp[Nmax];

inline int timp(int i, int j)
{
    if(a[i]==a[j]) return N+1;
    return min( (int) (1LL*a[j]*(i-j))/(a[i]-a[j])+i,N+1);
}

inline void Solve()
{
    int i;
    dp[1]=a[1]; dq[1]=st=dr=1;
    for(i=2;i<=N;++i)
    {
        dq[++dr]=i; t[dr]=timp(i,dq[dr-1]);
        while(dr-st>=2 && t[dr]<t[dr-1])
        {
            dq[dr-1]=dq[dr--];
            t[dr]=timp(dq[dr],dq[dr-1]);
        }
        while(st<dr && t[st+1]<=i) ++st;
        dp[i]=1LL*a[dq[st]]*(i-dq[st]+1);
    }
}

int main()
{
    int i;
    long long sol=0;
    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);
    Solve();
    sol=1LL*a[1]*N;
    for(i=2;i<=N;++i)
        sol=max(sol,dp[i-1]+1LL*a[i]*(N-i+1));
    printf("%lld\n", sol);
    return 0;
}