제출 #1176197

#제출 시각아이디문제언어결과실행 시간메모리
1176197vjudge2Magic Tree (CEOI19_magictree)C++20
3 / 100
91 ms35652 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 1e5 + 5; int n, m, k, p[N]; vector<int> adj[N]; pair<int, int> hang[N]; map<int, int> mp[N]; void dfs(int u) { int mx = mp[u].size(), id = u; for (int v : adj[u]) { dfs(v); if (mp[v].size() > mx) mx = mp[v].size(), id = v; // for (int i = 0; i <= k; i++) dp[u][i] += dp[v][i]; } if (u != id) mp[u].swap(mp[id]); for (int v : adj[u]) { for (auto [key, value] : mp[v]) mp[u][key] += value; } int cur = hang[u].second; while (!mp[u].empty() && cur) { auto it = mp[u].upper_bound(hang[u].first); if (it == mp[u].end()) break; int tak = min(it->second, cur); if (it->second != tak) { mp[u][it->first] -= tak; break; } else mp[u].erase(it->second); cur -= tak; } mp[u][hang[u].first] += hang[u].second; // for (int i = 1; i <= k; i++) dp[u][i] = max(dp[u][i], dp[u][i-1]); } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> k; for (int i = 2; i <= n; i++) { cin >> p[i]; adj[p[i]].push_back(i); } for (int i = 1; i <= m; i++) { int v, d, w; cin >> v >> d >> w; hang[v] = {d, w}; } dfs(1); int fr = 0; for (auto v : mp[1]) fr += v.second; cout << fr << '\n'; }
#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...