Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Borderou de evaluare (job #2715828) | Subsir 2 | Cod sursa (job #3343545)
#include <bits/stdc++.h>
#define ld long double
#define int long long
using namespace std;
ifstream fin("avioane.in");
ofstream fout("avioane.out");
const int Nmax=1e5+5,inf=1e18;
struct line
{
int m,b;
int eval(int x)
{
return m*x+b;
}
};
ld intercept(line x,line y)
{
if(x.m==y.m) return inf;
return 1.0*(y.b-x.b)/(x.m-y.m);
}
int a[Nmax];
signed main()
{
int n;
fin>>n;
for(int i=1;i<=n;i++) fin>>a[i];
sort(a+1,a+n+1);
deque<line> dq;
dq.push_back({a[1],-a[1]});
int ans=a[1]*n;
for(int i=2;i<=n;i++)
{
while(dq.size()>1 && intercept(dq[0],dq[1])<i) dq.pop_front();
int value=dq[0].eval(i)+(n-i+1)*a[i];
///cout<<i<<' '<<value<<'\n';
ans=max(ans,value);
line newline={a[i],-i*a[i]};
while(dq.size()>1 && intercept(dq.back(),newline)<intercept(dq.back(),dq[dq.size()-2])) dq.pop_back();
if(dq.back().m<newline.m) dq.push_back(newline);
}
fout<<ans<<'\n';
return 0;
}