Cod sursa(job #586249)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 30 aprilie 2011 14:15:09
Problema Avioane Scor 20
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Open Marime 1.19 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define infile "avioane.in"
#define outfile "avioane.out"
#define nMax 100013
#define ll long long

using namespace std;

int v[nMax];
int w[nMax];
int n;
ll sol;

inline ll getSum(int itMin, int itMax) {
  return (ll)v[itMin] * (itMax - itMin) + (ll)v[itMax] * (n - itMax + 1);
}

void read() {
  scanf("%d\n", &n);
  for(int i = 1; i <= n; ++i)
    scanf("%d", &v[i]);
}

void solve() {

  sort(v+1, v+n+1);

  for(int i = n; i > 0; --i)
    if(v[i] == v[i+1]) w[i] = w[i+1];
    else w[i] = i+1;

  sol = max(sol, (ll)v[1] * n);
  if(n == 1) return;

  /*
  for(int i = 1; i <= n; ++i)
    printf("%d ", v[i]);
  printf("\n");
  */

  int itMin = 1;
  for(int itMax = 2; itMax <= n; ++itMax) {

    for(int i = max(1, itMin - 131); i <= itMin; ++i)
      sol = max(sol, getSum(i, itMax));

    while(w[itMin] < itMax && getSum(w[itMin], itMax) >= getSum(w[itMin], itMax)) {
      sol = max(sol, getSum(itMin, itMax));
      itMin = w[itMin];
    }
  }

}

void write() {
  printf("%lld\n", sol);
}

int main() {
  freopen(infile, "r", stdin);
  freopen(outfile, "w", stdout);

  read();
  solve();
  write();

  fclose(stdin);
  fclose(stdout);
  return 0;
}