Cod sursa(job #1193893)

Utilizator tudormaximTudor Maxim tudormaxim Data 2 iunie 2014 10:49:39
Problema Avioane Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int MAX_N=100100;
ll v[MAX_N];
int d[MAX_N],st,dr;

ll cost(int i,int j)
{
    if(v[i]==v[j])
    {
        return MAX_N;
    }
    return (v[j]*j-v[i]*i)/(v[j]-v[i]) + 1;
}

int main()
{
    freopen("avioane.in","r",stdin);
    freopen("avioane.out","w",stdout);
    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%ld",&v[i]);
    sort(v+1,v+n+1);
    ll ans=v[1]*n;
    d[++dr]=1;
    st=1;
    for(int t=2;t<=n;t++)
    {
        while(st<dr && cost(d[st],d[st+1])<=t)
            st++;
        ans=max(ans,(n-t+1)*v[t]+(t-d[st])*v[d[st]]);
        if(v[t]==v[d[dr]])
            continue;
        while(st<dr && cost(d[dr-1],t)>cost(d[dr],t) )
        {
            dr--;
        }
        d[++dr]=t;
    }
    printf("%ld",ans);
    return 0;
}