Cod sursa(job #789242)

Utilizator visanrVisan Radu visanr Data 17 septembrie 2012 17:54:19
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;

#define nmax 100010
#define ll long long


ll now[nmax], ans[nmax];
int N, A[nmax], S[nmax];


void Compute(int left, int right)
{
     if(left > right) return ;
     int mid = (left + right) / 2;
     for(int i = S[left - 1]; i <= min(mid, S[right + 1]); i ++)
     {
             ll val = 1LL * (mid - i + 1) * A[i];
             if(now[mid] < val)
             {
                         now[mid] = val;
                         S[mid] = i;
             }
     }
     Compute(left, mid - 1);
     Compute(mid + 1, right);
}

int main()
{
    freopen("avioane.in", "r", stdin);
    freopen("avioane.out", "w", stdout);
    int i;
    scanf("%i", &N);
    for(i = 1; i <= N; i++)
          scanf("%i", &A[i]);
    sort(A + 1, A + N + 1);
    S[N + 1] = N;
    Compute(1, N);
    ll sol = 0;
    for(i = 2; i <= N; i++)
          sol = max(sol, now[i - 1] + 1LL * A[i] * (N - i + 1));
    printf("%lld\n", sol);
    return 0;
}