Cod sursa(job #1515861)

Utilizator smaraldaSmaranda Dinu smaralda Data 2 noiembrie 2015 12:17:13
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

#define LL long long
const int NMAX = 1e5 + 5;

int n, ticket[NMAX], pos[NMAX];
LL sol[NMAX];

void solve (int left, int right) {
    if(left > right)
        return;

    int i, mid = (left + right) / 2;
    LL sum;

    for(i = max(mid, pos[left - 1]); i <= pos[right + 1]; ++ i) {
        sum = ((LL)i - mid) * ticket[mid] + ((LL)n - i + 1) * ticket[i];
        if(sum > sol[mid]) {
            sol[mid] = sum;
            pos[mid] = i;
        }
    }

    solve(left, mid - 1);
    solve(mid + 1, right);
}

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

    scanf("%d", &n);
    for(i = 1; i <= n; ++ i)
        scanf("%d", &ticket[i]);

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

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

    ans = -1;
    for(i = 1; i <= n; ++ i)
        ans = max(ans, sol[i]);
    printf("%lld\n", ans);
    return 0;
}