Submission #1209897

#TimeUsernameProblemLanguageResultExecution timeMemory
1209897k1r1t0Fireworks (APIO16_fireworks)C++20
100 / 100
514 ms73800 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 310000; int n, m, p[N], c[N]; vector<int> g[N]; multiset<int> st[N]; void dfs(int v) { if (g[v].empty()) { st[v].insert(c[v]); st[v].insert(c[v]); return; } int slope = 0; for (int u : g[v]) { dfs(u); slope++; if (st[u].size() > st[v].size()) st[u].swap(st[v]); for (auto x : st[u]) st[v].insert(x); st[u].clear(); } while (slope > 1) { st[v].erase(prev(st[v].end())); slope--; } int r = *st[v].rbegin(); st[v].erase(prev(st[v].end())); int l = *st[v].rbegin(); st[v].erase(prev(st[v].end())); st[v].insert(l + c[v]); st[v].insert(r + c[v]); } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; n += m; for (int i = 2; i <= n; i++) { cin >> p[i] >> c[i]; g[p[i]].push_back(i); } dfs(1); int ans = 0; for (int i = 2; i <= n; i++) ans += c[i]; int slope = st[1].size() - 1; int pos = 0; for (int k : st[1]) { ans -= slope * (k - pos); slope--; pos = k; } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...