Pagini recente » Cod sursa (job #668926) | Cod sursa (job #876244) | Cod sursa (job #1157395) | Cod sursa (job #277371) | Cod sursa (job #1803996)
#include <cstdio>
#define NMAX 100000
#include <algorithm>
#include <vector>
#define inf 1e12
using namespace std;
struct aww
{
long long a,b;
};
int n,i,j;
aww v[NMAX+5];
vector <int> s;
double xx[NMAX+5];
long long sol=-1LL;
bool cmp(aww A,aww B)
{
if(A.a>B.a)
return false;
if(A.a==B.a && A.b>B.b)
return false;
return true;
}
double slv(aww A,aww B)
{
if(A.a==B.a)
return -inf;
return 1.0*(B.b-A.b)/(A.a-B.a);
}
int main()
{
freopen("avioane.in","r",stdin);
freopen("avioane.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;++i)
{
long long x;
scanf("%lld",&x);
v[i].a=x;
}
sort(v+1,v+n+1,cmp);
for(i=1;i<=n;++i)
v[i].b=-1LL*i*v[i].a;
for(i=1;i<=n;++i)
{
while(!s.empty() && slv(v[s.back()],v[i])<=xx[s.size()-1])
s.pop_back();
if(s.empty())
xx[0]=-inf;
else
xx[s.size()]=slv(v[s.back()],v[i]);
s.push_back(i);
}
j=0;
for(i=1;i<=n;++i)
{
while(j<s.size()-1 && xx[j+1]<=1.0*i)
++j;
sol=max(sol,v[s[j]].a*1LL*i+v[s[j]].b+v[i].a*(n-i+1));
}
printf("%lld\n",sol);
return 0;
}