Submission #1178651

#TimeUsernameProblemLanguageResultExecution timeMemory
1178651gygJobs (BOI24_jobs)C++20
100 / 100
332 ms73088 KiB
#include <bits/stdc++.h>   
using namespace std;
#define int long long
#define arr array 
#define vec vector 
#define pii pair<int, int>
#define fir first 
#define sec second 
const int N = 3e5 + 5, INF = 5e18;

int n, s;
arr<int, N> vl;
arr<vec<int>, N> ch;

arr<int, N> dp;
void dfs(int u = 0) {
    for (int v : ch[u]) dfs(v);
    if (vl[u] >= 0) return;

    set<pii> ord;
    for (int v : ch[u]) ord.insert({dp[v], v});
    
    int st = -vl[u], cr = 0;
    while (ord.size() && st > cr) {
        int v = ord.begin()->sec; ord.erase(ord.begin());
        if (dp[v] == INF) continue;
        if (cr < dp[v]) {
            int df = dp[v] - cr;
            st += df, cr += df;
        }
        cr += vl[v];
        for (int w : ch[v]) ord.insert({dp[w], w});
    }
    dp[u] = (st > cr) ? INF : st;
}

void cmp() {
    set<pii> ord = {{dp[0], 0}};
    int t = s;
    while (ord.size()) {
        int u = ord.begin()->sec; ord.erase(ord.begin());
        if (dp[u] > t) continue;
        t += vl[u];
        for (int v : ch[u]) ord.insert({dp[v], v}); 
    }
    cout << t - s << '\n';
}

signed main() {
    // freopen("in", "r", stdin);
    cin >> n >> s;
    for (int u = 1; u <= n; u++) {
        int v; cin >> vl[u] >> v;
        ch[v].push_back(u);
    }

    dfs();
    // for (int u = 1; u <= n; u++)  
    //     cout << u << ": " << dp[u] << '\n';
    cmp();
}
#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...