Cod sursa(job #1170246)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 12 aprilie 2014 23:40:50
Problema Avioane Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 1.02 kb
#include<fstream>
#include<algorithm>

#define dim 100008

using namespace std;

ifstream f("avioane.in");
ofstream g("avioane.out");
int N;
long long SOL[dim],l[dim];
 long long A[dim];
inline long long maxim( long long a ,long long b)
{
    if( a<b )
        return b;

    return a;
}
void solve(int st,int dr)
{
    int mid=(st+dr)/2;
    SOL[mid]=-1;

    for(    int i=l[st-1] ; i<=l[dr+1]; ++i)
    {
        if( i>=mid  )
            break;

        long long X=A[i]*(mid-i+1);
        if(X>SOL[mid])
        {
            SOL[mid]=X;
            l[mid]=i;
        }
    }
    if(mid-1>=st)
    solve(st,mid-1);
    if(mid+1<=dr)
    solve(mid+1,dr);
}
int main ()
{
    f   >> N ;


    long long MAX=0;

    for(    int i=1;  i <= N; ++i)
    {
        f   >>  A[i]    ;
    }

    sort( A+1, A+1+N);
    l[N+1]=N;
    solve(1,N);
    for(   int  i=2; i<=N ; ++i )
    {

           MAX=maxim( MAX, A[i]*(N-i+1)+ SOL[i-1]);

    }

    g<<MAX<<"\n";
    return 0;
}