Cod sursa(job #1521164)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 9 noiembrie 2015 23:04:09
Problema Avioane Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
#include <algorithm>
#define MAXN 100000
using namespace std;
int v[MAXN],poz[MAXN],n;
void cauta(int st,int dr){
    if(st<=dr){
        long long max=0;
        int j=-1,i;
        for(i=poz[st-1];i<=poz[dr+1]&&i<=(st+dr)/2;i++)
           if(max<1LL*((st+dr)/2-i)*v[i]+1LL*(n-(st+dr)/2)*v[(st+dr)/2]){
              max=1LL*((st+dr)/2-i)*v[i]+1LL*(n-(st+dr)/2)*v[(st+dr)/2];
              j=i;
           }
        if(j>-1)
           poz[(st+dr)/2]=j;
        cauta(st,(st+dr)/2-1);
        cauta((st+dr)/2+1,dr);
    }
}
int main(){
    FILE*fi,*fout;
    int i,j;
    long long max;
    fi=fopen("avioane.in" ,"r");
    fout=fopen("avioane.out" ,"w");
    fscanf(fi,"%d" ,&n);
    for(i=1;i<=n;i++)
        fscanf(fi,"%d" ,&v[i]);
    sort(v+1,v+n+1);
    poz[0]=1;
    poz[n+1]=n;
    cauta(1,n);
    max=0;
    for(i=1;i<=n;i++)
       if(max<1LL*(i-poz[i])*v[poz[i]]+1LL*(n-i+1)*v[i])
           max=1LL*(i-poz[i])*v[poz[i]]+1LL*(n-i+1)*v[i];
    fprintf(fout,"%lld" ,max);
    fclose(fi);
    fclose(fout);
    return 0;
}