Cod sursa(job #1226383)

Utilizator ZenusTudor Costin Razvan Zenus Data 5 septembrie 2014 12:55:36
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <climits>
#include <algorithm>

using namespace std;

#define NMAX 100007

int A[NMAX],f[NMAX];
int left=1,right=1,i,N;
long long MAX;

long long answer(int economy,int business)
{
    return (long long)A[economy]*(business-economy)+ (long long)A[business]*(N-business+1);
}

int solve(int i,int j)
{
    return (A[i]==A[j]) ? INT_MAX : (A[j]*j-A[i]*i)/(A[j]-A[i])+1;
}

void read()
{
    int i;

    for (i=1,scanf("%d",&N);i<=N;++i) scanf("%d",&A[i]);
    sort(A+1,A+N+1);

    MAX=(long long)N*A[1];
}

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

read();

for (i=2,f[1]=1;i<=N;++i)
{
    while (left<right && solve(f[left],f[left+1])<=i) ++left;

    MAX=max(MAX,answer(f[left],i));
    if (A[i]==A[f[left]]) continue;

    while (left<right && solve(f[right],i)<solve(f[right-1],i)) --right;
    f[++right]=i;
}

printf("%lld",MAX);

return 0;
}