Cod sursa(job #1450062)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 11 iunie 2015 12:26:08
Problema Avioane Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <algorithm>
#include <queue>

using namespace std;

const int Nmax = 100010;

int n , L , i , ans;
int a[Nmax] , left[Nmax];

queue < int > q;

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

    L = 1; left[1] = a[1];

    for (i = 2; i <= n; ++i)
    {
        left[i] = (i - L + 1) * a[L];

        while (!q.empty())
        {
            if ((i - q.front() + 1) * a[q.front()] > left[i])
                left[i] = (i - q.front() + 1) * a[q.front()],
                L = q.front(),
                q.pop();
            else break;
        }

        if (q.empty() || a[i] != a[q.back()])
            q.push(i);

        if (a[i] > left[i])
        {
            L = i;
            left[i] = a[i];
            while (!q.empty())
                q.pop();
        }
    }

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

    ans = max(ans , left[n]);

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

    return 0;
}