Pagini recente » Cod sursa (job #2308087) | Cod sursa (job #1076217) | Cod sursa (job #1418755) | Cod sursa (job #1315790) | Cod sursa (job #2404825)
#include <iostream>
#include <fstream>
#include <climits>
#include <algorithm>
#define ll long long
using namespace std;
ifstream fin("avioane.in");
ofstream fout("avioane.out");
const ll inf=LLONG_MAX;
const ll minf=LLONG_MIN;
const int nmx=100005;
ll n,i,j,a,b,nr,p,tp;
ll dp[nmx],rez,k;
struct Per
{ ll a,b;
bool operator<(const Per &alt)const
{ return a<alt.a; }
} stk[nmx],v[nmx];
ll linePoint(Per p1,Per p2)
{
if(p1.a==p2.a)
return inf;
return (p2.b-p1.b)/(p1.a-p2.a);
}
ll fvalue(ll f,ll x)
{
return v[f].a*x+v[f].b;
}
int main() {
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i].a;
sort(v+1,v+n+1);
for(i=1;i<=n;i++)
v[i].b=v[i].a*(1-i);
p=1;
rez=v[1].a*n;
stk[tp=1]={1,minf};
for(i=2;i<=n;i++)
{
while(tp>1 && linePoint(v[stk[tp].a],v[i])<=stk[tp].b)
tp--;
k=linePoint(v[stk[tp].a],v[i]);
if(k!=inf) stk[++tp]={i, k};
p=min(p,tp);
while(p<tp && i>stk[p+1].b)
p++;
rez=max(rez, fvalue(stk[p].a, i)+(n-i)*v[i+1].a);
}
fout<<rez<<"\n";
}