Pagini recente » Cod sursa (job #3270485) | Cod sursa (job #2526572) | Cod sursa (job #310258) | Cod sursa (job #2121177) | Cod sursa (job #1209651)
#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) {
if (d1.panta==d2.panta) return 0;
return (d1.st*d1.panta+d2.panta-d2.st*d2.panta-d1.st)/(d1.panta-d2.panta);
}
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];
// fout<<"1 ";
for (i=2; i<n; ++i){
tip dc;
dc.st=i;
dc.panta=a[i];
if (a[i]==a[i-1]){
while (vf<lim && f(stiva[vf],i)<=f(stiva[vf+1],i)) ++vf;
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);
// fout<<stiva[vf].st<<" ";
}
}
for (i=2; i<=n; ++i)
sol=max(sol,a[i]*(n-i+(long long)1)+aux[i-1]);
fout<<sol;
/*fout<<"\n";
for (i=1; i<n; ++i) fout<<aux[i]<<" ";
fout<<"\n\n";
int pmax[10000];
for (i=1; i<=n; ++i){
long long maxim=0,pmaxc;
for (j=i; j>=1; --j)
if (a[j]*(i-j+1)>maxim) { maxim=a[j]*(i-j+1); pmaxc=j; };
fout<<maxim<<" ";
pmax[i]=pmaxc;
}
fout<<"\n";
for (i=1; i<=n; ++i) fout<<pmax[i]<<" ";*/
return 0;
}