제출 #656753

#제출 시각아이디문제언어결과실행 시간메모리
656753hoanghq2004Fireworks (APIO16_fireworks)C++14
26 / 100
13 ms16796 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("O3") #pragma GCC optimize ("unroll-loops") #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; template <typename T> using ordered_set = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>; const int N = 3e5 + 10; int n, m; vector <int> g[N]; priority_queue <long long> s[N]; long long a[N], b[N], w[N]; int main() { ios :: sync_with_stdio(0); cin.tie(0); cin >> n >> m; n += m; for (int v = 2; v <= n; ++v) { int u; cin >> u; cin >> w[v]; g[u].push_back(v); } for (int u = n; u >= 1; --u) { if (g[u].empty()) { s[u].push(w[u]), s[u].push(w[u]); a[u] = 1, b[u] = - w[u]; continue; } for (auto v: g[u]) { if (s[u].size() < s[v].size()) swap(s[u], s[v]); while (s[v].size()) s[u].push(s[v].top()), s[v].pop(); a[u] += a[v]; b[u] += b[v]; } while (a[u] > 1) { --a[u]; b[u] += s[u].top(); s[u].pop(); } b[u] -= w[u]; int p0 = s[u].top(); s[u].pop(); int p1 = s[u].top(); s[u].pop(); s[u].push(p0 + w[u]); s[u].push(p1 + w[u]); } cout << b[1] + s[1].top(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...