Pagini recente » Cod sursa (job #1045286) | Cod sursa (job #1888955) | Cod sursa (job #539689) | Cod sursa (job #3252926) | Cod sursa (job #1233762)
#include <cstdio>
#include <algorithm>
#define Nmax 100005
using namespace std;
int N,a[Nmax],dq[Nmax],st,dr,t[Nmax];
long long dp[Nmax];
inline int timp(int i, int j)
{
if(a[i]==a[j]) return N+1;
return min( (int) (1LL*a[j]*(i-j))/(a[i]-a[j])+i,N+1);
}
inline void Solve()
{
int i;
dp[1]=a[1]; dq[1]=st=dr=1;
for(i=2;i<=N;++i)
{
dq[++dr]=i; t[dr]=timp(i,dq[dr-1]);
while(dr-st>=2 && t[dr]<t[dr-1])
{
dq[dr-1]=dq[dr--];
t[dr]=timp(dq[dr],dq[dr-1]);
}
while(st<dr && t[st+1]<=i) ++st;
dp[i]=1LL*a[dq[st]]*(i-dq[st]+1);
}
}
int main()
{
int i;
long long sol=0;
freopen ("avioane.in","r",stdin);
freopen ("avioane.out","w",stdout);
scanf("%d", &N);
for(i=1;i<=N;++i)
scanf("%d", &a[i]);
sort(a+1,a+N+1);
Solve();
sol=1LL*a[1]*N;
for(i=2;i<=N;++i)
sol=max(sol,dp[i-1]+1LL*a[i]*(N-i+1));
printf("%lld\n", sol);
return 0;
}