Cod sursa(job #2043319)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 19 octombrie 2017 21:22:00
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <algorithm>

typedef long long i64;
const i64 INF  = 2e14;
const int MAXN = 1e5;

int v[MAXN + 1], poz[MAXN + 1];
i64 d[MAXN + 1];

inline i64 gmax(i64 a, i64 b) {
  return a > b ? a : b;
}

inline void solve(int st, int dr, int n) {
  i64 sum;
  if (st > dr) {
    return;
  }
  int m = (st + dr) >> 1;
  d[m] = -INF;
  for (int i = poz[st - 1]; i <= poz[dr + 1]; ++i) {
    sum = (i64)(m - i) * v[i] + (i64)(n - m + 1) * v[m]; 
    if (d[m] < sum) {
      d[m] = sum;
      poz[m] = i;
    }
  }
  solve(m + 1, dr, n);
  solve(st, m - 1, n);
}      

int main() {
  int n;
  i64 max;
  FILE *f = fopen("avioane.in", "r");
  fscanf(f, "%d", &n);
  for (int i = 1; i <= n; ++i) {      
    fscanf(f, "%d", &v[i]);
  }
  fclose(f);
  std::sort(v + 1, v + n + 1);
  poz[0] = 1;
  poz[n + 1] = n;
  solve(1, n, n);
  max = -INF;
  for (int i = 1; i <= n; ++i) {
    max = gmax(max, d[i]);
  }
  f = fopen("avioane.out", "w");
  fprintf(f, "%lld\n", max);
  fclose(f);
  return 0;
}