Cod sursa(job #3343585)

Utilizator tudor_costinCostin Tudor tudor_costin Data 27 februarie 2026 19:33:41
Problema Avioane Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#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;
}