Cod sursa(job #1536034)

Utilizator hrazvanHarsan Razvan hrazvan Data 25 noiembrie 2015 16:24:47
Problema Avioane Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#define MAXN 100000
#define EPS 0.0000001
int v[MAXN], dq[MAXN];

void qs(int st, int dr){
  int i = st, j = dr, piv = v[(st + dr) / 2], aux;
  while(i <= j){
    while(v[i] < piv)
      i++;
    while(v[j] > piv)
      j--;
    if(i <= j){
      aux = v[i];  v[i] = v[j];  v[j] = aux;
      i++;  j--;
    }
  }
  if(st < j)
    qs(st, j);
  if(i < dr)
    qs(i, dr);
}

inline long long inters(int p1, int p2){
  long long a = 1LL * v[p1] * (p2 - p1);
  if(v[p2] == v[p1])
    return 1000000000000;
  return (long long)(1.0 * a / (v[p2] - v[p1]) + p1 + 0.999999);
}

int main(){
  FILE *in = fopen("avioane.in", "r");
  int n, i;
  fscanf(in, "%d", &n);
  for(i = 0; i < n; i++)
    fscanf(in, "%d", &v[i]);
  fclose(in);
  qs(0, n - 1);
  int st = 0, dr = 1;
  long long max = 1LL * v[0] * n;
  dq[0] = 0;
  for(i = 1; i < n; i++){
    while(dr - st >= 2 && 1LL * v[dq[st]] * (i - dq[st]) <= 1LL * v[dq[st + 1]] * (i - dq[st + 1]))
      st++;
    if(max < 1LL * v[i] * (n - i) + 1LL * v[dq[st]] * (i - dq[st]))
      max = 1LL * v[i] * (n - i) + 1LL * v[dq[st]] * (i - dq[st]);
    while(dr > st && 1LL * v[dq[dr - 1]] * (i - dq[dr - 1] + 1) <= 1LL * v[i])
      dr--;
    while(dr - st >= 2 && inters(dq[dr - 2], dq[dr - 1]) >= inters(dq[dr - 1], i))
      dr--;
    dq[dr] = i;
    dr++;
  }
  FILE *out = fopen("avioane.out", "w");
  fprintf(out, "%lld", max);
  fclose(out);
  return 0;
}