Cod sursa(job #586029)

Utilizator darrenRares Buhai darren Data 30 aprilie 2011 13:23:34
Problema Avioane Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 5-9 Marime 0.98 kb
#include <fstream>
#include <algorithm>
#include <deque>

using namespace std;

typedef unsigned long long ull;

ull N;
ull P[100002];
deque<ull> D;
ull result;

int main()
{
    ifstream fin("avioane.in");
    ofstream fout("avioane.out");

    fin >> N;
    for (int i = 1; i <= N; ++i)
        fin >> P[i];
    sort(P + 1, P + N + 1);

    if (N == 1)
    {
        fout << P[1];
        fin.close();
        fout.close();
        return 0;
    }

    for (ull i = N - 1; i >= 1; --i)
    {
        while (!D.empty() && P[i] * (N - i) >= P[D.back()] * (N - D.back()))
            D.pop_back();
        D.push_back(i);
    }

    for (ull i = N; i >= 2; --i)
    {
        while (D.front() >= i) D.pop_front();
        while (D.size() > 1 && P[D[0]] * (i - D[0]) <= P[D[1]] * (i - D[1])) D.pop_front();

        result = max(result, P[i] * (N - i + 1) + P[D.front()] * (i - D.front()));
    }

    fout << result;

    fin.close();
    fout.close();
}