Pagini recente » Cod sursa (job #2593614) | Cod sursa (job #2820091) | Cod sursa (job #1229005) | Cod sursa (job #2070743) | Cod sursa (job #864414)
Cod sursa(job #864414)
#include<stdio.h>
#include<algorithm>
#define maxn 100005
using namespace std;
FILE*f=fopen("avioane.in","r");
FILE*g=fopen("avioane.out","w");
const long long inf = 1LL<<62;
int n;
int A[maxn],st[maxn],left[maxn];
inline int get_inters ( int a , int b ){
int left = b,middle,right = n;
while ( left <= right ){
middle = (left+right)>>1;
if ( 1LL*A[a]*(middle-a+1) >= 1LL*A[b]*(middle-b+1) ){
right = middle-1;
}
else{
left = middle+1;
}
}
return left;
}
int main () {
fscanf(f,"%d",&n);
for ( int i = 1 ; i <= n ; ++i ){
fscanf(f,"%d",&A[i]);
}
sort(A+1,A+n+1);
for ( int i = 1 ; i <= n ; ++i ){
int k = 1;
while ( st[0] && (k = get_inters(i,st[st[0]])) <= left[st[0]] ){
st[st[0]--] = 0;
}
st[++st[0]] = i;
left[st[0]] = k;
}
int p = 0; long long sol = -inf;
for ( int i = 1 ; i <= n+1 ; ++i ){
while ( p < st[0] && left[p+1] <= i ){
++p;
}
sol = max(sol,1LL*A[st[p]]*(i-st[p]) + 1LL*A[i]*(n-i+1));
}
fprintf(g,"%lld",sol);
fclose(f);
fclose(g);
return 0;
}