Submission #833703

#TimeUsernameProblemLanguageResultExecution timeMemory
833703MilosMilutinovicMagic Tree (CEOI19_magictree)C++14
3 / 100
92 ms19064 KiB
/** * author: wxhtzdy * created: 22.08.2023 09:39:57 **/ #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m, k; cin >> n >> m >> k; vector<vector<int>> g(n); for (int i = 1; i < n; i++) { int p; cin >> p; --p; g[p].push_back(i); } vector<int> x(n, -1), y(n); for (int i = 0; i < m; i++) { int v, d, w; cin >> v >> d >> w; --v; x[v] = d; y[v] = w; } vector<set<pair<int, int>>> dp(n); vector<int> f(n); auto Insert = [&](int v, int d, int val) { long long s = 0; for (auto& p : dp[f[v]]) { if (p.first < d) { s += p.first; if (s > val) { break; } } else { break; } } if (s <= val) { while (!dp[f[v]].empty() && dp[f[v]].begin()->first < d) { dp[f[v]].erase(dp[f[v]].begin()); } dp[f[v]].emplace(d, val); } }; function<void(int)> Solve = [&](int v) { int ch = -1; long long sum = 0; for (int u : g[v]) { Solve(u); auto it = dp[f[u]].lower_bound({x[v] + 1, -1LL}); if (it != dp[f[u]].begin()) { it = prev(it); sum += it->first; } if (ch == -1 || (int) dp[f[ch]].size() < (int) dp[f[u]].size()) { ch = u; } } if (ch != -1) { f[v] = f[ch]; } else { f[v] = v; } for (int u : g[v]) { if (u == ch) { continue; } else { for (auto& p : dp[f[u]]) { dp[f[v]].insert(p); } dp[f[u]].clear(); } } Insert(v, x[v], y[v]); }; Solve(0); long long ans = 0; for (auto& p : dp[f[0]]) { ans += p.second; } cout << ans << '\n'; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...