Cod sursa(job #1988961)

Utilizator akaprosAna Kapros akapros Data 5 iunie 2017 13:26:39
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>
#define maxN 100002
#define ll long long
using namespace std;

FILE *fin = freopen("avioane.in", "r", stdin);
FILE *fout = freopen("avioane.out", "w", stdout);

/* ----------------------- */
int n, v[maxN];
/* ----------------------- */
deque < int > d;
/* ----------------------- */
ll ans;

bool f(int i, int j1, int j2)
{
    ll s1 = 1LL * v[j1] * (n - j1 + 1) - 1LL * v[j2] * (n - j2 + 1),
       s2 = 1LL * v[i]  *  (n - i + 1) - 1LL * v[j1] * (n - j1 + 1);
    return 1LL * s2 * (j2 - j1) >= 1LL * s1 * (j1 - i);
}
bool Event(int i, int j1, int j2)
{
    ll s = 1LL * v[j2] * (n - j2 + 1) - 1LL * v[j1] * (n - j1 + 1) + 1LL * v[i] * (j2 - j1);
    return s <= 0LL;
}

void dqFront(int i)
{
    while (d.size() > 1)
    {
        int j2 = d.front();
        d.pop_front();
        int j1 = d.front();
        if (Event(i, j1, j2))
            continue;
        d.push_front(j2);
        break;
    }
}
void dqBack(int i)
{
    while (d.size() > 1)
    {
        int j1 = d.back();
        d.pop_back();
        int j2 = d.back();
        if (f(i, j1, j2))
            continue;
        d.push_back(j1);
        break;
    }
}
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++ i)
        scanf("%d", &v[i]);
    sort(v + 1, v + n + 1);
    ans = v[n];
    d.push_back(n);
    for (int i = n - 1; i >= 1; -- i)
    {
        dqBack(i);
        d.push_back(i);
        dqFront(i);
        //printf("%d\n", d.front());
        ans = max(ans, 1LL * v[i] * (d.front() - i) + 1LL * v[d.front()] * (n - d.front() + 1));
    }
    printf("%lld\n", ans);

    return 0;
}