| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1245964 | LittleOrange | Nile (IOI24_nile) | C++20 | 0 ms | 0 KiB | 
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
struct dsu{
    ll n,ans;
    vector<ll> p,mi,sm;
    dsu(const vector<ll> &a):n(a.size()),ans(0),p(a.size(),-1),mi(a),sm(a){}
    ll g(ll i){
        return p[i]<0?i:p[i]=g(p[i]);
    }
    ll cal(ll i){
        return sm[i]-(p[i]&1)*mi[i];
    }
    void m(ll a, ll b){
        a = g(a),b = g(b);
        if(a==b)return;
        ans -= cal(a)+cal(b);
        if(p[a]>p[b]) swap(a,b);
        sm[a] += sm[b];
        mi[a] = min(mi[a],mi[b]);
        p[a] += p[b];
        p[b] = a;
        ans += cal(a);
    }
};
vector<long long> calculate_costs(vector<int> w, vector<int> a, vector<int> b, vector<int> e){
    ll n = w.size();
    ll q = e.size();
    ll tot = 0;
    for(ll i : a) tot += i;
    vector<pair<ll,ll>> v;
    for(ll i = 0;i<n;i++) v.push_back({w[i],a[i]-b[i]});
    sort(v.begin(),v.end());
    vector<ll> h(n);
    for(ll i = 0;i<n;i++) h[i] = v[i].second;
    dsu d(h);
    vector<pair<ll,ll>> u;
    for(ll i = 0;i<n-1;i++) u.push_back({v[i+1].first-v[i].first,i});
    sort(u.begin(),u.end());
    vector<pair<ll,ll>> o;
    o.push_back({0,0});
    for(auto [dd,i] : u){
        d.m(i,i+1);
        o.push_back({dd,d.ans});
    }
    vector<ll> ret(q);
    for(ll i = 0;i<q;i++){
        ret[i] = *--lower_bound(o.begin(),o.end(),pair<ll,ll>((ll)e[i]+1,0ll));
    }
    return ret;
}
