Cod sursa(job #585541)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 29 aprilie 2011 23:50:42
Problema Avioane Scor Ascuns
Compilator cpp Status done
Runda Marime 0.75 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define nmax 100222

int sol, R[nmax], A[nmax], n, par[nmax];

void doit(int a, int b)
{
  if(a > b)
    return;
  int c = (a + b) / 2, i;
  R[c] = -1;
  for(i = par[a - 1]; i <= par[b + 1]; ++i)
    if((c - i + 1) * A[i] > R[c])
      R[c] = (c - i + 1) * A[i], par[c] = i;
  doit(a, c - 1);
  doit(c + 1, b);
}

int main()
{
  int i;
  freopen("avioane.in", "r", stdin);
  freopen("avioane.out", "w", stdout);
  scanf("%d", &n);
  for(i = 1; i <= n; ++i)
    scanf("%d", &A[i]);
  sort(A + 1, A + n + 1);
  par[0] = 0;
  par[n + 1] = n;
  doit(1, n);
  for(i = 2; i <= n; ++i)
    if((n - i + 1) * A[i] + R[i - 1] > sol)
      sol = (n - i + 1) * A[i] + R[i - 1];
  printf("%d\n", sol);
  return 0;
}