Cod sursa(job #1235368)

Utilizator xtreme77Patrick Sava xtreme77 Data 29 septembrie 2014 17:44:15
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <algorithm>

const char IN [ ] = "avioane.in" ;
const char OUT [ ] = "avioane.out" ;
const int MAX = 100014 ;
const long long INF = 1LL << 61 ;
using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

long long v [ MAX ] , dp [ MAX ] ;
int poz [ MAX ] , n ;

inline void chmax ( long long &a , long long b )
{
    if ( b > a )
        a = b ;
}

void impart ( int st , int dr )
{
    if ( st > dr )
        return ;
    int mij = ( st + dr ) >> 1 ;
    dp [ mij ] = -INF ;

    for ( int i = poz [ st - 1 ] ; i <= poz [ dr + 1 ] ; ++ i )
    {
        long long sum = 1LL * ( mij - i ) * v [ i ] + 1LL * ( n - mij + 1 ) * v [ mij ] ;
        if ( sum > dp [ mij ] )
        {
            dp [ mij ] = sum ;
            poz [ mij ] = i ;
        }
    }
    impart ( st , mij - 1 ) ;
    impart ( mij + 1 , dr ) ;
}

int main(              )
{
    fin >> n ;
    for ( int i = 1 ; i <= n ; ++ i )
        fin >> v [ i ] ;
    poz [ 0 ] = 1 ;
    poz [ n + 1 ] = n ;
    sort ( v + 1 , v + n + 1 ) ;
    impart ( 1 , n ) ;
    long long sol = - INF ;
    for ( int i = 1 ; i <= n ; ++ i )
        chmax ( sol , dp [ i ] ) ;
    fout << sol ;
    return 0;
}