제출 #1214278

#제출 시각아이디문제언어결과실행 시간메모리
1214278stefanneaguJobs (BOI24_jobs)C++20
0 / 100
17 ms10816 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int inf = 1e18, nmax = 1e5;

set<pair<int, int>> con[nmax];
vector<int> adj[nmax];
int v[nmax];

void dfs(int i) {
    for (auto it : adj[i]) {
        dfs(it);
        if (con[it].size() > con[i].size()) {
            swap(con[i], con[it]);
        }
        for (auto it : con[it]) {
            con[i].insert(it);
        }
        con[it].clear();
    }
    pair<int, int> tp = {min(0ll, v[i]), v[i]};
    vector<pair<int, int>> des;
    for (auto it : con[i]) {
        if (tp.second > 0) {
            break;
        }
        tp = {max(tp.first, it.first - tp.second), tp.second + it.second};
        des.push_back(it);
    }
    for (auto it : des) {
        con[i].erase(it);
    }
    if (tp.second <= 0) {
        return;
    }
    if (con[i].size() == 0) {
        con[i].insert(tp);
        return;
    }
    des.clear();
    for (auto it : con[i]) {
        if (it.first <= tp.first) {
            tp.second += it.second;
            des.push_back(it);
        } else {
            break;
        }
    }
    for (auto it : des) {
        con[i].erase(it);
    }
    con[i].insert(tp);
}

int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n, s;
    cin >> n >> s;
    for (int i = 1; i < n; i++) {
        int tata;
        cin >> v[i] >> tata;
        adj[tata].push_back(i);
    }
    dfs(0);
    int xtra = 0;
    for (auto it : con[0]) {
        if (s + xtra >= it.first) {
            xtra += it.second;
        }
    }
    cout << xtra;
    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...