Cod sursa(job #1535689)

Utilizator ZenusTudor Costin Razvan Zenus Data 25 noiembrie 2015 01:14:31
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 100000 + 10;

long long n , i , p , u , qmax , x;
long long q[nmax] , a[nmax] , b[nmax];

double f(int i , int j)
{
    return 1.0 * (q[j] - q[i]) / (j - i);
}

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

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

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

for (i = 1 ; i <= n ; ++i)
q[i] = a[i] * i;

p = 1 , u = 0;
for (i = 1 ; i <= n ; ++i)
{
    while (p < u && f(b[p] , b[p + 1]) >= a[i])
    p += 1;

    x = max(x , q[b[p]] + (i - b[p]) * a[i]);

    if (q[i] > qmax)
    {
        while (p < u && f(b[u] , i) >= f(b[u - 1] , b[u]))
        u -= 1;

        b[++u] = i;
        qmax = q[i];
    }
}

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

return 0;
}