Submission #1361495

#TimeUsernameProblemLanguageResultExecution timeMemory
1361495NewtonabcJobs (BOI24_jobs)C++20
100 / 100
227 ms62424 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+10;
ll val[N];
int pa[N],id[N];
vector<int> adj[N];
struct uwu{
    ll req,pro;
    bool operator<(const uwu &x) const {
        return req>x.req;
    }
};
priority_queue<uwu> q[N];
void deb(int u){
    vector<uwu> v;
    while(!q[u].empty()){
        //cout<<q[u].top().req <<" " <<q[u].top().pro <<"\n";
        v.push_back(q[u].top());
        q[u].pop();
    }
    while(!v.empty()){
        q[u].push(v.back());
        v.pop_back();
    }
}
int merge(int x,int y){
    if(q[x].size()>q[y].size()) swap(x,y);
    while(!q[x].empty()){
        auto bk=q[x].top();
        q[x].pop();
        q[y].push(bk);
    }
    return y;
}
void modi(int x,uwu y){
    while(!q[x].empty() && (y.pro<=0 || y.req>=q[x].top().req)){
        auto t=q[x].top();
        q[x].pop();
        y.req=max(y.req,t.req-y.pro);
        y.pro+=t.pro;
    }
    if(y.pro>0) q[x].push(y);
}
void dfs(int u){
    if(adj[u].size()==0){
        //cout<<"lv" <<u <<"\n";
        //cout<<0 <<" " <<val[u] <<"\n";
        id[u]=u;
        if(val[u]>0) q[u].push({0,val[u]});
        return;
    }
    for(int i=0;i<adj[u].size();i++){
        int v=adj[u][i];
        dfs(v);
        if(i==0) id[u]=id[v];
        else id[u]=merge(id[u],id[v]);
    }
    uwu tmp={max(0LL,-val[u]),val[u]};
    //cout<<"pr";
    //deb(id[u]);
    modi(id[u],tmp);
    //cout<<"vs" <<u <<"\n";
    //deb(id[u]);
    
}
int main(){
    int n; cin>>n >>val[0];
    for(int i=1;i<=n;i++){
        cin>>val[i] >>pa[i];
        adj[pa[i]].push_back(i);
    }
    dfs(0);
    ll ans=0;
    while(!q[id[0]].empty()){
        auto [ta,tb]=q[id[0]].top();
        q[id[0]].pop();
        if(ans<ta) break;
        ans+=tb;
    }
    cout<<ans-val[0];
}
#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...