Submission #1066278

#TimeUsernameProblemLanguageResultExecution timeMemory
1066278antonJobs (BOI24_jobs)C++17
43 / 100
2069 ms99004 KiB
#include<bits/stdc++.h>
    
using namespace std;
    
#define int long long 
#define pii pair<int, int>
const int MAX_N = 3e5+1;
int N, S;
    
vector<vector<int>> ch;
vector<int> x;

struct merger{
    vector<vector<pii>> groups;
    priority_queue<pii> ev;

    void add(vector<pii> vals){
        int id = groups.size();
        groups.push_back(vals);
        if(vals.size()>0){
            ev.push({vals.back().first, id});
        }
    }

    bool empty(){
        return ev.size()==0;
    }

    pii get(){
        pii cords = ev.top();
        ev.pop();
        pii val = groups[cords.second].back();
        groups[cords.second].pop_back(); 
        if(groups[cords.second].size()>0){
            ev.push({groups[cords.second].back().first, cords.second});
        }
        return val;
    }
};
    
vector<pii> dfs(int i){


    merger m;
    for(auto e: ch[i]){
        m.add(dfs(e));
    }


    vector<pii> ev;

    while(!m.empty()){
        ev.push_back(m.get());
    }
    reverse(ev.begin(), ev.end());
    ev.push_back({x[i], x[i]});


    while(ev.size()>1 && ev.back().second<0){
        pii cur = ev.back();
        ev.pop_back();
        ev.back().second += cur.second;
        ev.back().first = min(ev.back().first + cur.second, cur.first);
    }

    if(ev.back().second<0){
        return {};
    }

    int cur_s = 0;
    int cost = 0;

    
    vector<pii> res;

    while(ev.size()>0){
        
        pii cur_stats= ev.back();
        ev.pop_back();
        if(cur_stats.first+cur_s>=0){
            
        }
        else{
            cost += cur_stats.first+cur_s;
            cur_s = -cur_stats.first;
        }
        cur_s += cur_stats.second;
        res.push_back({cur_stats.first, cur_stats.second});
    }
    
    

    if(res.back().second<0){
        return {};
    }
    reverse(res.begin(), res.end());
    return res;
}
signed main(){
    cin>>N>>S;
    x.resize(N+1, 0);
    ch.resize(N+1);
    for(int i = 0; i<N; i++){
        int p;
        cin>>x[i+1]>>p;
        ch[p].push_back(i+1);
    }

    auto ev = dfs(0);

    int init_s= S;

    while(ev.size()>0 && ev.back().first+S>=0){
        S+= ev.back().second;
        ev.pop_back();
    }

    cout<<S-init_s<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...