Submission #1323669

#TimeUsernameProblemLanguageResultExecution timeMemory
1323669huoiJobs (BOI24_jobs)C++17
29 / 100
234 ms215304 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define INF 1e18

void solve() {
    int n;
    cin >> n;

    vector<int> p(n + 1);
    cin >> p[0];

    vector<int> roots;
    vector<queue<int>> a(n + 1);
    multiset<pair<int, int>> st;

    int curroot = 0;
    for (int i = 1; i <= n; i++) {
        int dep; cin >> p[i] >> dep;
        if (dep == 0) {
            roots.push_back(i);
            curroot = i;
        }
        a[curroot].push(p[i]);
    }

    bool popped = true;
    while (popped) {
        popped = false;
        for (int root : roots) {
            if (a[root].empty()) continue;
            int req = 0, sum = 0;
            do {
                // cout << "popping " << a[root].front() << " from " << root << "\n";
                popped = true;
                sum += a[root].front();
                req = min(req, sum);
                a[root].pop();
            } while (!a[root].empty() && sum <= 0);
            if (sum > 0) st.insert({-req, sum});
        }
    }

    int ans = p[0];
    for (auto [req, sum] : st) {
        // cout << req << " " << sum << "\n";
        if (ans >= req) {
            ans += sum;
        }
    }
    cout << ans - p[0];
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}
#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...