Submission #1368058

#TimeUsernameProblemLanguageResultExecution timeMemory
1368058AlmontherTree (IOI24_tree)C++20
0 / 100
2096 ms18348 KiB
#include<bits/stdc++.h>

using namespace std;

#define ll long long
vector<int>par,wei;
ll n;
void init(std::vector<int> P, std::vector<int> W){
    par=P,wei=W;
    n=par.size();
}
long long query(int L, int R){
    vector<ll>val(n+5,0);
    multiset<array<ll,2>>vals[n+5];
    ll ans=0;
    for(int i=n-1;i>=0;i--){
        ll x=val[i];
        if(x>R){
            while(x>R){
                if(vals[i].size()){
                    auto[cost,num]=*vals[i].begin();
                    if(cost<=wei[i]){
                        vals[i].erase(vals[i].begin());
                        if(num>=x-R){
                            ans+=(x-R)*cost,num-=x-R,x=R;
                            if(num) vals[i].insert({cost,num});
                        }
                        else x-=num,ans+=num*cost;
                    }
                    else ans+=(x-R)*wei[i],val[i]=R;
                }
                else ans+=(x-R)*wei[i];
            }
            val[i]=R;
        }
        else if(x<L) ans+=(L-x)*wei[i],val[i]=L;
        ll diff=x-L;
        if(i){
            vector<array<ll,2>>del;
            for(auto [weei,no]:vals[i]){
                if(weei>wei[i]||diff<=0) del.push_back({weei,no});
                else diff-=no;
            }
            for(auto j:del) vals[i].erase(j);
            if(diff<=0&&vals[i].size()){
                array<ll,2>a=*vals[i].rbegin();
                vals[i].extract(a);
                a[1]+=diff;
                vals[i].insert(a);
            }
            else vals[i].insert({wei[i],diff});
            for(auto j:vals[i]) vals[par[i]].insert(j);
            vals[i].clear();
            val[par[i]]+=val[i];
        }
    }
    return ans;
}
// int main(){
//     init({-1, 0, 0}, {1, 1, 1});
//     cout<<query(1, 1)<<' '<<query(1, 2)<<'\n';
// }
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...