Cod sursa(job #918344)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 20:15:14
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<stdio.h>
#include<algorithm>
 
#define maxn 100005
 
using namespace std;
 
FILE*f=fopen("avioane.in","r");
FILE*g=fopen("avioane.out","w");
 
const long long inf = 1LL<<62;
int n;
int A[maxn],st[maxn],left[maxn];
 
inline int get_inters ( int a , int b ){
     
    int left = b,middle,right = n;
    while ( left <= right ){
        middle = (left+right)>>1;
         
        if ( 1LL*A[a]*(middle-a+1) >= 1LL*A[b]*(middle-b+1) ){
            right = middle-1;
        }
        else{
            left = middle+1;
        }
    }
     
    return left;
}
 
int main () {
     
    fscanf(f,"%d",&n);
    for ( int i = 1 ; i <= n ; ++i ){
        fscanf(f,"%d",&A[i]);
    }
     
    sort(A+1,A+n+1);
     
    for ( int i = 1 ; i <= n ; ++i ){
         
        int k = 1;
        while ( st[0] && (k = get_inters(i,st[st[0]])) <= left[st[0]] ){
            st[st[0]--] = 0;
        }
        st[++st[0]] = i;
        left[st[0]] = k;
    }
     
    int p = 0; long long sol = -inf;
    for ( int i = 1 ; i <= n+1 ; ++i ){
         
        while ( p < st[0] && left[p+1] <= i ){
            ++p;
        }
        sol = max(sol,1LL*A[st[p]]*(i-st[p]) + 1LL*A[i]*(n-i+1));
    }
     
    fprintf(g,"%lld",sol);
     
    fclose(f);
    fclose(g);
     
    return 0;
}