Submission #1183695

#TimeUsernameProblemLanguageResultExecution timeMemory
1183695CyanmondJobs (BOI24_jobs)C++20
100 / 100
251 ms64884 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ll2 = pair<ll, ll>;

int main() {
    int n;
    ll s;
    cin >> n >> s;

    n += 1;
    vector<ll> x(n);
    vector<vector<int>> g(n);
    x[0] = 0;
    for (int i = 1; i < n; ++i) {
        int p;
        cin >> x[i] >> p;
        g[p].push_back(i);
    }

    vector<priority_queue<ll2, vector<ll2>, greater<ll2>>> pqs(n);

    auto merge = [&](auto &pq1, auto &pq2) {
        if (int(pq1.size()) < int(pq2.size())) {
            swap(pq1, pq2);
        }
        while (not pq2.empty()) {
            pq1.push(pq2.top());
            pq2.pop();
        }
    };

    auto dfs = [&](auto &&self, int v) -> void {
        auto &pq = pqs[v];
        for (int t : g[v]) {
            self(self, t);
            merge(pq, pqs[t]);
        }

        if (x[v] > 0) {
            pq.push(make_pair(0ll, x[v]));
        } else if (not pq.empty()) {
            ll req = -x[v];
            ll prf = x[v];
            while (prf <= 0 and !pq.empty()) {
                auto [r, p] = pq.top();
                pq.pop();
                req = max(req, -prf + r);
                prf += p;
            }
            if (prf > 0) {
                while (!pq.empty() and pq.top().first <= req) {
                    prf += pq.top().second;
                    pq.pop();
                }
                pq.push(make_pair(req, prf));
            }
        }
    };

    dfs(dfs, 0);

    ll prf = 0;
    auto &pq = pqs[0];
    while (!pq.empty()) {
        auto [r, p] = pq.top();
        pq.pop();
        if (r <= prf + s) {
            prf += p;
        }
    }

    cout << prf << 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...