This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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];
long long p0 = s[u].top(); s[u].pop();
long long 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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |