Cod sursa(job #1536015)

Utilizator hrazvanHarsan Razvan hrazvan Data 25 noiembrie 2015 16:05:00
Problema Avioane Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>
#define MAXN 100000
#define EPS 0.000000001
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 char cmp(double x, double y){
  if(x - y > EPS)
    return 1;
  if(y - x > EPS)
    return -1;
  return 0;
}

inline double inters(int p1, int p2){
  int a = v[p1] * (p2 - p1);
  return 1.0 * a / (v[p2] - v[p1]) + p1;
}

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) <= v[i])
      dr--;
    while(dr - st >= 2 && cmp(inters(dq[dr - 2], dq[dr - 1]), inters(dq[dr - 1], i)) == 1)
      dr--;
    dq[dr] = i;
    dr++;
  }
  FILE *out = fopen("avioane.out", "w");
  fprintf(out, "%lld", max);
  fclose(out);
  return 0;
}