这题可以把操作理解成“拿一个数当扩音器,把它的值广播给别人然后自己消失”。
最优策略很直观:只要当前最小数是负的,就让它给所有剩余数都加一次(这样降得最快);一旦最小数已经不负了,继续操作只会让结果变大,所以直接把剩下的数一路合并,答案就是当前总和。

void solve(){
    int n;cin>>n;
    vll a(n+1),suf(n+2);
    for(int i=1;i<=n;++i)cin>>a[i];
    sort(a.begin()+1,a.end());
    for(int i=n;i>=1;--i)suf[i]=suf[i+1]+a[i];
    ll ad=0;
    for(int i=1;i<=n;++i){
        ll x=a[i]+ad;
        if(x<0&&i<n){
            ad+=x;
        }else{
            ll ans=suf[i]+ad*(n-i+1);
            cout<<ans<<endl;
            return;
        }
    }
}