Cod sursa(job #1228483)

Utilizator matei_cChristescu Matei matei_c Data 14 septembrie 2014 13:05:41
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
using namespace std ;

#define maxn 100005
#define inf 100000000000000000000

int N, v[maxn] ;

long long d[maxn] ;
long long sol = -inf ;

int poz[maxn] ;

void solve(int st,int dr)
{
    if( st > dr )
        return ;

    int mij = ( st + dr ) / 2 ;
    d[mij] = -inf ;

    int lim = min( mij, poz[dr + 1] ) ;

    for(int i = poz[st - 1]; i <= lim; ++i)
    {
        if( (long long)( N - mij + 1 ) * v[mij] + (long long)( mij - i ) * v[i] > d[mij] )
        {
            d[mij] = (long long)( N - mij + 1 ) * v[mij] + (long long)( mij - i ) * v[i] ;
            poz[mij] = i ;
        }
    }

    solve( st, mij - 1 ) ;
    solve( mij + 1, dr ) ;
}

int main()
{
	std::ios_base::sync_with_stdio(false) ;

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

    cin >> N ;

    for(int i = 1; i <= N; ++i)
        cin >> v[i] ;

    sort( v + 1, v + N + 1 ) ;

    poz[0] = 1 ;
    poz[N + 1] = N ;

    solve( 1, N ) ;

    for(int i = 1; i <= N; ++i)
        if( d[i] > sol )
            sol = d[i] ;

    cout << sol ;

    return 0 ;
}