Cod sursa(job #1536417)

Utilizator hrazvanHarsan Razvan hrazvan Data 26 noiembrie 2015 09:17:27
Problema Avioane Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#define MAXN 100000
#define EPS 0.0000001
#define INFLL 1000000000000000LL
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){
  if(v[p1] == v[p2])
    return INFLL;
  return (1LL * p2 * v[p2] - 1LL * p1 * v[p1]) / (v[p2] - v[p1]) + 1;
}

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