Cod sursa(job #1520774)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 9 noiembrie 2015 14:01:23
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <algorithm>
#include <cctype>
#define INF 1000000000000000000LL
#define BUF_SIZE 4096
#define MAXN 100000
int v[MAXN+1], dq[MAXN];
int pos=BUF_SIZE;
char buf[BUF_SIZE];
FILE *fin;
inline char nextch(){
    if(pos==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fin);
        pos=0;
    }
    return buf[pos++];
}
inline int read(){
    int x=0;
    char ch=nextch();
    while(!isdigit(ch)){
        ch=nextch();
    }
    while(isdigit(ch)){
        x=10*x+ch-'0';
        ch=nextch();
    }
    return x;
}
inline long long timp(int a, int b){
    if(v[a]==v[b]){
        return INF;
    }
    return (b*(long long)v[b]-a*(long long)v[a])/(v[b]-v[a])+1;
}
int main(){
    int n, i, st, dr;
    long long ans;
    FILE *fout;
    fin=fopen("avioane.in", "r");
    fout=fopen("avioane.out", "w");
    n=read();
    for(i=1; i<=n; i++){
        v[i]=read();
    }
    std::sort(v+1, v+n+1);
    ans=v[2]*(long long)(n-1)+v[1];
    st=0;
    dr=2;
    dq[0]=1;
    dq[1]=2;
    for(i=3; i<=n; i++){
        while((dr-st>1)&&(timp(dq[st], dq[st+1])<i)){
            st++;
        }
        while((dr-st>1)&&(timp(dq[dr-2], dq[dr-1])>timp(dq[dr-2], i))){
            dr--;
        }
        dq[dr++]=i;
        if(ans<v[i]*(long long)(n-i+1)+v[dq[st]]*(long long)(i-dq[st])){
            ans=v[i]*(long long)(n-i+1)+v[dq[st]]*(long long)(i-dq[st]);
        }
    }
    fprintf(fout, "%lld\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}