Pagini recente » Cod sursa (job #810920) | Borderou de evaluare (job #1409968) | Cod sursa (job #882712) | Cod sursa (job #1875307) | Cod sursa (job #727632)
Cod sursa(job #727632)
#include <fstream>
#include <stdio.h>
#include <algorithm>
#define NMax 100010
using namespace std;
const char IN[]="avioane.in",OUT[]="avioane.out";
struct point{
double x;
double y;
};
struct dreapta{
double a,b;
} d[NMax];
int N,L;long long Rez;
int A[NMax];
point intersect(dreapta &A,dreapta &B){
point ret={
(B.b-A.b)/(double)(A.a-B.a),
(A.b*B.a-B.b*A.a)/(double)(B.a-A.a)
};
return ret;
}
void add(double a,double b){
dreapta x={a,b};
while (L>1){
point x1=intersect(x,d[L]);
point x2=intersect(x,d[L-1]);
if (x1.x<x2.x) --L;
else break;
}
d[++L]=x;
}
int main()
{
int i,j;
freopen(IN,"r",stdin);
scanf("%d",&N);
for (i=1;i<=N;++i)
scanf("%d",A+i);
fclose(stdin);
sort(A+1,A+N+1);
j=1;
add(A[1],-A[1]);
for (i=2;i<=N;++i)
{
for (;j<L;){
point x=intersect(d[j],d[j+1]);
if (x.x<=i) ++j;
else break;
}
long long r=1LL*i*d[j].a+d[j].b;
Rez=max(Rez,r+1LL*A[i]*(N-i+1));
if (A[i]==A[i-1]) continue;
add(A[i],-A[i]*(double)i);
}
ofstream fout(OUT);
fout<<Rez<<"\n";
fout.close();
return 0;
}