Cod sursa(job #587679)

Utilizator SpiderManSimoiu Robert SpiderMan Data 5 mai 2011 16:19:18
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
# include <algorithm>
# include <cstdio>

const char *FIN = "avioane.in", *FOU = "avioane.out" ;
const int MAX = 100005 ;

long long sol, V[MAX] ;
int S[MAX], P[MAX] ;
int N ;

void solve ( int st, int dr ) {
    int mij = st + dr >> 1 ;
    if ( st > dr ) return ;

    V[mij] = -1 ;
    for ( int i = P[st - 1]; i <= P[dr + 1]; ++i ) {
        if ( (mij - i + 1) * 1LL * S[i] > V[mij] ) {
            V[mij] = (mij - i + 1) * 1LL * S[i], P[mij] = i ;
        }
    }
    solve ( st, mij - 1 ), solve ( mij + 1, dr ) ;
}

int main (void) {
    freopen (FIN, "r", stdin);

    scanf ("%d", &N) ;
    for ( int i = 1; i <= N; ++i ) {
        scanf ("%d", S + i) ;
    }
    std :: sort (S + 1, S + N + 1);

    P[N + 1] = N, solve ( 1, N ) ;

    for ( int i = 2; i <= N; ++i ) {
        if ( (N - i + 1) * 1LL * S[i] + V[i - 1] > sol ) {
            sol = (N - i + 1) * 1LL * S[i] + V[i - 1] ;
        }
    }

    fprintf (fopen (FOU, "w"), "%lld", sol) ;
}