Pagini recente » Cod sursa (job #1429034) | Cod sursa (job #1915783) | Cod sursa (job #1653184) | Cod sursa (job #1343269) | Cod sursa (job #586032)
Cod sursa(job #586032)
#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 pre[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;
long long mx=v[0].val;
long long mxv=v[0].val;
int con=0;
long long x=-1; long long xv=-1,cf;
pre[0]=mx;
for (i=1;i<=n-1;i++) {
con++;
if (con==x && xv!=-1) {
mx=(con)*xv;
mxv=xv;
xv=-1;
x=-1;
}
if (mxv<v[i].val) {
cf=mx / (v[i].val-mxv);
if (cf==0) {
mx=0;
mxv=v[i].val;
xv=-1;
x=-1;
}
else
if (x && (x-con==cf) && xv*x<v[i].val*cf) {
x=cf;
con=0;
xv=v[i].val;
}
else
if (x==-1 || (x-con)>cf) {
x=cf;
con=0;
xv=v[i].val;
}
}
mx+=mxv;
pre[i]=mx;
}
mx1=(long long)n*v[0].val;
for (i=0;i<n;i++) {
if ( (long long)pre[i]+v[i+1].val*(n-1-i) > mx1 )
mx1=(long long)pre[i]+v[i+1].val*(n-1-i);
}
/*
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;
}