Cod sursa(job #1702910)

Utilizator cristina_borzaCristina Borza cristina_borza Data 15 mai 2016 19:50:45
Problema Avioane Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <algorithm>
#include <fstream>
#include <cstdio>

#define NMAX 100005

using namespace std;

unsigned int pos[NMAX] , v[NMAX] , dp[NMAX];
unsigned int ans , n;

void solve(unsigned int st , unsigned int dr);

template <class T>

void read(T &x) {
    T sign = 1;
    char ch;
    x = 0;

    while(!isdigit(ch = getchar())) {
        if(ch == '-') {
            sign = -1;
        }

        else {
            sign = 1;
        }
    }

    do {
        x = x * 10 + ch - '0';
    }while(isdigit(ch = getchar()));
    x *= sign;
}

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

    read(n);
    for(int i = 1 ; i <= n ; ++i) {
        read(v[i]);
    }

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

    pos[0] = 1 , pos[n + 1] = n;
    solve(1 , n);

    for(int i = 1 ;  i <= n ; ++i) {
        ans = max(ans , dp[i]);
    }

    printf("%u" , ans);
    return 0;
}

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

    unsigned int mid = st + (dr - st) / 2;
    for(int i = pos[st - 1] ; i <= pos[dr + 1] && i <= mid ; ++i) {
        unsigned int aux = v[mid] * (n - mid + 1) + v[i] * (mid - i);

        if(aux > dp[mid]) {
            dp[mid] = aux;
            pos[mid] = i;
        }
    }

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