Cod sursa(job #1989585)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 8 iunie 2017 00:36:11
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
long long v[maxN];
deque<int> q;
int n,m;
long long sol;
inline long long S(int i,int j)
{
    return 1LL*v[i]*(j-i)+1LL*v[j]*(n-j+1);
}
inline bool Lefter(int i,int j,int k)
{
    //if(Panta(i,k)<Panta(i,j)) return 1;
    //return 0;
    long long rez1=1LL*v[j]*(n-j+1)-1LL*v[k]*(n-k+1);
    long long rez2=1LL*v[i]*(n-i+1)-1LL*v[j]*(n-j+1);
    return rez2*1LL*(k-j)>=1LL*rez1*(j-i);
}
int main()
{
    freopen("avioane.in","r",stdin);
    freopen("avioane.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&v[i]);
    }
    sort(v+1,v+n+1);
    //sol=1LL*n;
    sol=1LL*v[n];
    q.push_back(n);
    for(int i=n-1;i>=1;i--)
    {
        while(q.size()>1)
        {
            int last=q.back();
            q.pop_back();
            int pre=q.back();
            if(!Lefter(i,last,pre))
            {
                q.push_back(last);
                break;
            }
        }
        q.push_back(i);
        while(q.size()>1)
        {
            int last=q.front();
            q.pop_front();
            int pre=q.front();
            if(S(i,last)>=S(i,pre))
            {
                q.push_front(last);
                break;
            }
        }
        sol=max(sol,1LL*v[i]*(q.front()-i)+1LL*v[q.front()]*(n-q.front()+1));
    }
    printf("%lld\n",sol);
    return 0;
}