Pagini recente » Cod sursa (job #1140657) | Cod sursa (job #117347) | Cod sursa (job #2602514) | Cod sursa (job #301387) | Cod sursa (job #1209661)
#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];
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);
}
}
for (i=2; i<=n; ++i)
sol=max(sol,a[i]*(n-i+(long long)1)+aux[i-1]);
fout<<sol;
return 0;
}