Cod sursa(job #1450232)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 12 iunie 2015 01:08:05
Problema Avioane Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int Nmax = 100010;

int n , i;
int start[Nmax] , a[Nmax];

long long ans;
long long dp[Nmax];

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

    int mid = (left + right) >> 1;

    for (int i = start[left]; i <= mid && i <= start[right]; ++i)
        if (1LL * (mid - i) * a[i] + 1LL * (n - mid + 1) * a[mid] > dp[mid])
            dp[mid] = 1LL * (mid - i) * a[i] + 1LL * (n - mid + 1) * a[mid],
            start[mid] = i;

    divide(left , mid);
    divide(mid + 1 , right);
}

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

    scanf("%d", &n);

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

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

    /// start[i] = [(start[i] ... i - 1) - economy] [(i ... n) - business]

    start[1] = 1; start[n] = n;

    divide(1 , n);

    for (i = 1; i <= n; ++i)
        ans = max(ans , dp[i]);

    printf("%lld\n", ans);

    return 0;
}