Pagini recente » Cod sursa (job #3345677) | Cod sursa (job #248569) | Cod sursa (job #3344984) | Cod sursa (job #597004) | Cod sursa (job #3343585)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin("avioane.in");
ofstream fout("avioane.out");
const int Nmax=1e5+5,inf=INT_MAX;
struct line
{
int a,b;
int operator()(int x){return a*x+b;}
};
struct NOD
{
int l,r;
line L;
};
vector<NOD> nodes;
int new_node()
{
line temp={0,-inf};
NOD nxt;
nxt.l=nxt.r=-1;
nxt.L=temp;
nodes.push_back(nxt);
return (1LL*signed(nodes.size())-1LL);
}
void update(int nod,int st,int dr,line cur)
{
if(nodes[nod].L(st)<cur(st)) swap(nodes[nod].L,cur);
if(st==dr) return;
int mid=(st+dr)/2;
if(nodes[nod].L(mid)>cur(mid))
{
if(nodes[nod].r==-1)
{
int x=new_node();
nodes[nod].r=x;
}
update(nodes[nod].r,mid+1,dr,cur);
}
else
{
swap(nodes[nod].L,cur);
if(nodes[nod].l==-1)
{
int x=new_node();
nodes[nod].l=x;
}
update(nodes[nod].l,st,mid,cur);
}
}
int query(int nod,int st,int dr,int x)
{
int val=nodes[nod].L(x);
if(st==dr) return val;
int mid=(st+dr)/2;
if(x<=mid)
{
if(nodes[nod].l==-1) return val;
return max(val,query(nodes[nod].l,st,mid,x));
}
else
{
if(nodes[nod].r==-1) return val;
return max(val,query(nodes[nod].r,mid+1,dr,x));
}
}
int a[Nmax];
signed main()
{
int n;
fin>>n;
int root=new_node();
for(int i=1;i<=n;i++) fin>>a[i];
sort(a+1,a+n+1);
///cout<<111<<'\n';
update(root,1,inf,{0,0});
int ans=0;
for(int i=1;i<=n;i++)
{
int val=query(root,1,inf,i)+(n-i+1)*a[i];
ans=max(ans,val);
/// cout<<val<<' '<<i<<'\n';
line newline={a[i],-i*a[i]};
update(root,1,inf,newline);
}
fout<<ans<<'\n';
return 0;
}