Cod sursa(job #585692)

Utilizator costyv87Vlad Costin costyv87 Data 30 aprilie 2011 11:06:57
Problema Avioane Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 5-9 Marime 1.31 kb
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f,*g;
int n,i,st,dr,j;
struct cp{int x,y,val;} v[100100];

long long s1,s2,mx2,mx1;

void caut2(int i, int j,int fn) {
int m;

if (i<=j) {
    m=(i+j)/2;
    m=v[m].x;

        if ( (long long)v[m].val*( fn-m+1)>= (long long) v[m-1].val*(fn-v[m-1].x+1)) {
            if (mx2<m) mx2=m;
            caut2(v[m].y+1,j,fn);
            }
        else
            caut2(i,m-1,fn);

    }

}

bool cmp(cp i, cp j) {
return (i.val<j.val);

}

int main() {
f=fopen("avioane.in","r");
g=fopen("avioane.out","w");

fscanf(f,"%d",&n);
for (i=0;i<n;i++)
    fscanf(f,"%d",&v[i].val);

sort(v,v+n,cmp);


mx1=-1;

for (i=0;i<n;i=dr+1) {
    st=i;
    dr=i-1;
    for (j=i;v[j].val==v[i].val && j<n;j++,dr++);
    for (j=st;j<=dr;j++) {
        v[j].x=st;
        v[j].y=dr;
        }
    }


v[n].x=v[n].y=n+100;
mx1=-1;


for (i=v[0].y;i<n;i=v[i+1].y) {
        mx2=-1;
        caut2(v[0].y+1,v[i].x-1,v[i].x-1);

        if (mx2==-1) {
            s2=(long long) (v[i].x)*v[0].val;
            }
        else {
            s2=(long long) v[mx2].val*(v[i].x-mx2);
            }
        s1=(long long) (n-v[i].x)*v[i].val+s2;
        if (s1>mx1) mx1=s1;
        }


fprintf(g,"%lld",mx1);

fclose(g);
return 0;
}