Cod sursa(job #1803996)

Utilizator delia_99Delia Draghici delia_99 Data 12 noiembrie 2016 09:32:02
Problema Avioane Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#define NMAX 100000
#include <algorithm>
#include <vector>
#define inf 1e12
using namespace std;

struct aww
{
    long long a,b;
};

int n,i,j;
aww v[NMAX+5];
vector <int> s;
double xx[NMAX+5];
long long sol=-1LL;

bool cmp(aww A,aww B)
{
    if(A.a>B.a)
        return false;
    if(A.a==B.a && A.b>B.b)
        return false;
    return true;
}

double slv(aww A,aww B)
{
    if(A.a==B.a)
        return -inf;
    return 1.0*(B.b-A.b)/(A.a-B.a);
}

int main()
{
    freopen("avioane.in","r",stdin);
    freopen("avioane.out","w",stdout);

    scanf("%d",&n);

    for(i=1;i<=n;++i)
    {
        long long x;
        scanf("%lld",&x);
        v[i].a=x;
    }

    sort(v+1,v+n+1,cmp);

    for(i=1;i<=n;++i)
        v[i].b=-1LL*i*v[i].a;

    for(i=1;i<=n;++i)
    {
        while(!s.empty() && slv(v[s.back()],v[i])<=xx[s.size()-1])
            s.pop_back();
        if(s.empty())
            xx[0]=-inf;
        else
            xx[s.size()]=slv(v[s.back()],v[i]);
        s.push_back(i);
    }

    j=0;
    for(i=1;i<=n;++i)
    {
        while(j<s.size()-1 && xx[j+1]<=1.0*i)
            ++j;
        sol=max(sol,v[s[j]].a*1LL*i+v[s[j]].b+v[i].a*(n-i+1));
    }

    printf("%lld\n",sol);

    return 0;
}