Cod sursa(job #1791121)

Utilizator ZenusTudor Costin Razvan Zenus Data 29 octombrie 2016 09:41:35
Problema Avioane Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 100009;

int a[nmax] , opt[nmax];
int i , n;
long long answer;

long long w(int i , int j)
{
    return 1LL * a[i] * i + 1LL * a[j] * (j - i);
}

void solve(int l , int r , int lw , int hg)
{
    int mid = (l + r) / 2;

    opt[mid] = lw;
    for (int i = lw ; i <= hg ; ++i)
    if (w(i , mid) >= w(opt[mid] , mid)) opt[mid] = i;

    if (l <= mid - 1) solve(l , mid - 1 , lw , opt[mid]);
    if (mid + 1 <= r) solve(mid + 1 , r , opt[mid] , hg);
}

int main()
{

freopen("test.in" , "r" , stdin);
freopen("test.out" , "w" , stdout);

scanf("%d" , &n);

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

sort(a + 1 , a + n + 1 , [&](int x , int y){return x > y;});

solve(1 , n , 1 , n);

for (i = 1 ; i <= n ; ++i)
answer = max(answer , w(opt[i] , i));

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

return 0;
}