제출 #1086603

#제출 시각아이디문제언어결과실행 시간메모리
1086603IBoryJobs (BOI24_jobs)C++17
0 / 100
268 ms74576 KiB
#include <bits/stdc++.h> #define pii pair<ll, ll> typedef long long ll; using namespace std; const int MAX = 300003; set<int> G[MAX]; priority_queue<pii, vector<pii>, greater<pii>> PQ[MAX]; pii S[MAX], off[MAX]; ll P[MAX]; void DFS(int cur) { for (int next : G[cur]) DFS(next); auto& [a, b] = S[cur]; while (!PQ[cur].empty()) { auto [c, d] = PQ[cur].top(); c += off[cur].first; d += off[cur].second; if (b < c) break; if (c < d) b = b + d - c; PQ[cur].pop(); } if (!cur) return; if (a < b) PQ[P[cur]].emplace(a - off[P[cur]].first, b - off[P[cur]].second); off[cur].first += a - b; off[cur].second += min(0LL, a - b); if (PQ[cur].size() > PQ[P[cur]].size()) { swap(off[cur], off[P[cur]]); swap(PQ[cur], PQ[P[cur]]); } while (!PQ[cur].empty()) { auto [c, d] = PQ[cur].top(); PQ[cur].pop(); c = c + off[cur].first; d += off[cur].second; PQ[P[cur]].emplace(c - off[P[cur]].first, d - off[P[cur]].second); } // cout << "Current " << cur << ": " << a << ' ' << b << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); ll N, IS; cin >> N >> IS; S[0] = {0, IS}; for (int i = 1; i <= N; ++i) { ll s; cin >> s >> P[i]; G[P[i]].insert(i); if (s < 0) S[i] = {-s, 0}; else S[i] = {0, s}; } DFS(0); ll ans = S[0].second - IS; cout << ans; 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...