Cod sursa(job #1450203)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 11 iunie 2015 20:42:39
Problema Avioane Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <algorithm>
#include <queue>

using namespace std;

const int Nmax = 100010;

int n , L , i;
int a[Nmax] , indice[Nmax];

long long ans;
long long left[Nmax];

int Binary_Search(int left , int right)
{
    long long anterior = 0;

    for (int mid = (left + right) >> 1; left <= right; mid = (left + right) >> 1)
    {
        if (1LL * (i - mid + 1) * a[mid] >= anterior)
        {
            anterior = 1LL * (i - mid + 1) * a[mid];
            right = mid - 1;
        }
        else left = mid + 1;
    }

    return left;
}

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);

    left[1] = 1LL * a[1]; indice[1] = 1;

    for (i = 2; i <= n; ++i)
    {
        int poz = Binary_Search(indice[i-1] , i);

        left[i] = 1LL * (i - poz + 1) * a[poz]; indice[i] = poz;
    }

    for (i = 0; i <= n; ++i)
        ans = max(ans , left[i] + 1LL * (n - i) * a[i+1]);

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

    return 0;
}