Cod sursa(job #1231499)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 20 septembrie 2014 19:55:47
Problema Avioane Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 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)
        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 - 1, solx, split);
    sol(mid + 1, pozy, split, pozy);
}

char a[2000000];
int p;

inline int ter() {
    int r = 0;

    while(a[p] >= '0' && a[p] <= '9')
        r = r * 10 + a[p++] - '0';
    ++p;
    return r;
}

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

    cin >> n;
    cin.get();
    cin.getline(a, 2000000);

    for(i = 1; i <= n; ++i) {
        x[i] = ter();
        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;
}