Cod sursa(job #1209660)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 18 iulie 2014 11:57:00
Problema Avioane Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 1.79 kb
#include<fstream>
#include<algorithm>
using namespace std;
typedef struct { long long st, panta; } tip;
tip stiva[100005];
long long i,n,m,a[100005],aux[100005],vf,sol,lim,j;

long long f(tip dr, long long x) {
  return (x-dr.st+(long long)1)*dr.panta;
}

long long intersect(tip d1, tip d2) {
  long double st1=d1.st, st2=d2.st, p1=d1.panta, p2=d2.panta;
  long double rez=(st1*p1+p2-st2*p2-p1)/(p1-p2);
  
  if ( (long long)rez==rez ) return (long long) rez;
  else return (long long)rez+(long long)1;  
}

int main(void) {
    ifstream fin("avioane.in");
    ofstream fout("avioane.out");
    
    fin>>n;
    for (i=1; i<=n; ++i) fin>>a[i];
    sort(a+1,a+n+1);
    
    vf=1; lim=1;
    stiva[vf].st=1;
    stiva[vf].panta=a[1];
    aux[1]=a[1];
   // fout<<"1 ";
    
    for (i=2; i<n; ++i){
        tip dc;
        dc.st=i;
        dc.panta=a[i];
        if (a[i]==a[i-1]) aux[i]=f(stiva[vf],i);
        else {
        
        while (lim>vf && intersect(dc,stiva[lim-1])<=intersect(stiva[lim],stiva[lim-1]) ) --lim;
        ++lim;
        stiva[lim]=dc;
        
        while (vf<lim && f(stiva[vf],i)<=f(stiva[vf+1],i)) ++vf;
        
        aux[i]=f(stiva[vf],i);
       // fout<<stiva[vf].st<<" ";
         }
       
        }
    
    for (i=2; i<=n; ++i)
      sol=max(sol,a[i]*(n-i+(long long)1)+aux[i-1]);
      
    fout<<sol;
   /* 
    fout<<"\n";
    for (i=1; i<n; ++i) fout<<aux[i]<<" ";
    fout<<"\n\n";
    
    int pmax[10000];
    for (i=1; i<=n; ++i){
        long long maxim=0,pmaxc;
        for (j=i; j>=1; --j)
         if (a[j]*(i-j+1)>maxim) { maxim=a[j]*(i-j+1); pmaxc=j; };
        fout<<maxim<<" ";
        pmax[i]=pmaxc;
        }
    fout<<"\n";
    for (i=1; i<=n; ++i) fout<<pmax[i]<<" ";
    */
   return 0;   
}