Cod sursa(job #1194517)

Utilizator WyvernFMI Stanescu Leonard Wyvern Data 3 iunie 2014 23:48:14
Problema Avioane Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 1.02 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
int v[100002], poz[100002];
long long solutie, sol[100002];
void calc (int st, int dr) {
    int i, m = (st + dr) >> 1;
    sol[m] = -2000000000;
    for (i = poz[st - 1]; i <= poz[dr + 1]; i ++) {
        if (i > m)
            break;
        if ((m - i + 1) * (long long)v[i] > sol[m]) {
            sol[m] = (m - i + 1) * (long long)v[i];
            poz[m] = i;
        }
    }
    if (m - 1 >= st)
        calc (st, m - 1);
    if (dr >= m + 1)
        calc (m + 1, dr);
}
int main () {
    freopen ("avioane.in", "r", stdin);
    freopen ("avioane.out", "w", stdout);
    scanf ("%d", &n);
    for (int i = 1; i <= n; i ++)
        scanf ("%d", &v[i]);
    sort (v + 1, v + n + 1);
    poz[n + 1] = n;
    calc (1, n);
    for (int i = 2; i <= n; i ++)
        if ((n - i + 1) * (long long)v[i] + sol[i - 1] > solutie)
            solutie = (n - i + 1) * (long long)v[i] + sol[i - 1];
    printf ("%lld\n", solutie);
    return 0;
}