Cod sursa(job #1231493)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 20 septembrie 2014 19:48:49
Problema Avioane Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

const int N = 101000;

int n, x[N];
long long d[N], rez;

void sol(int pozx, int pozy, int solx, int soly) {
    int i, mid = (pozx + pozy) / 2, split = solx;

    if(pozx == pozy && d[pozx] != 0)
        return;

    for(i = solx; i < mid && i <= soly; ++i) {
        if(1LL * x[i] * (mid - i) > d[mid]) {
            split = i;
        }

        d[mid] = max(d[mid], 1LL * x[i] * (mid - i));
    }

    if(pozx == pozy)
        return;

    sol(pozx, mid, solx, split);
    sol(mid + 1, pozy, split, pozy);
}

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

    cin >> n;

    for(i = 1; i <= n; ++i) {
        cin >> x[i];
        d[i] = 0;
    }
    sort(x + 1, x + n + 1);

    sol(1, n, 1, n);

    for(i = 1; i <= n; ++i)
        rez = max(rez, d[i] + 1LL * (n - i + 1) * x[i]);

    cout << rez;

    return 0;
}