Cod sursa(job #1994338)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 24 iunie 2017 18:39:51
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

ifstream cin("avioane.in");
ofstream cout("avioane.out");

const int MAXN = 100000;
const long long INF = 1000000000000000000LL;

int v[1 + MAXN + 1], where[1 + MAXN + 1];
long long best[1 + MAXN + 1];

void Solve(int left, int right) {
    int middle = (left + right) / 2;
    best[middle] = -INF;
    for (int i = where[left - 1]; i <= where[right + 1]; i++)
        if (best[middle] < 1LL * (middle - i + 1) * v[i] && i <= middle) {
            best[middle] = 1LL * (middle - i + 1) * v[i];
            where[middle] = i;
        }
    if (left < middle)
        Solve(left, middle - 1);
    if (middle < right)
        Solve(middle + 1, right);
}

int main() {
    int n;
    cin >> n;
    where[n + 1] = n;
    for (int i = 1; i <= n; i++)
        cin >> v[i];
    sort(v + 1, v + n + 1);
    Solve(1, n);
    long long answer = 0;
    for (int i = 0; i <= n; i++)
        answer = max(answer, best[i] + 1LL * (n - i) * v[i + 1]);
    cout << answer << "\n";
    return 0;
}