제출 #1163823

#제출 시각아이디문제언어결과실행 시간메모리
1163823vladiliusJobs (BOI24_jobs)C++20
40 / 100
226 ms79704 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define pb push_back
#define ff first
#define ss second

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n; ll s; cin>>n>>s;
    vector<int> g[n + 1], p(n + 1);
    vector<ll> a(n + 1);
    for (int i = 1; i <= n; i++){
        cin>>a[i]>>p[i];
        g[p[i]].pb(i);
    }
    
    priority_queue<pll> pq[n + 1];
    function<void(int, int)> dfs = [&](int v, int pr){
        for (int i: g[v]){
            if (i == pr) continue;
            dfs(i, v);
            
            if (pq[v].size() < pq[i].size()){
                swap(pq[v], pq[i]);
            }
            
            while (!pq[i].empty()){
                auto p = pq[i].top(); pq[i].pop();
                pq[v].push(p);
            }
        }
        
        if (pq[v].empty()){
            if (a[v] >= 0){
                pq[v].push({a[v], a[v]});
            }
            return;
        }
        
        pll p = {a[v], a[v]};
        while (!pq[v].empty() && p.ss < 0){
            auto [x, y] = pq[v].top(); pq[v].pop();
            p.ff = min(p.ff, p.ss + x);
            p.ss += y;
        }
        
        if (p.ss > 0) pq[v].push(p);
    };
    dfs(0, 0);
    
    ll out = 0;
    while (!pq[0].empty()){
        auto [x, y] = pq[0].top(); pq[0].pop();
        if ((s + x) < 0) break;
        s += y; out += y;
    }
    
    cout<<out<<"\n";
}
#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...