#include "tree.h"
#include "bits/stdc++.h"
using namespace std;
#define vec vector
#define int long long
#define all(x) (x).begin(), (x).end()
const int mod = 1e9 + 7;
const int inf = 1e18;
using pii = pair<int, int>;
template<typename T>
void print(const vec<T> &a) {
for(auto x: a) cerr << x << " ";
cerr << endl;
}
int n;
vec<int> p, w;
vec<vec<int>> adj;
int l, r;
pii memo[100'100][2];
bool done[100'100][2] = { 0 };
pii calc(int u, bool mn) {
if (done[u][mn]) return memo[u][mn];
done[u][mn] = true;
if (adj[u].empty()) {
return memo[u][mn] = {l, l * w[u]};
}
int ans_sum = l;
int ans_cost = inf;
int cost = 0;
int sum = l * adj[u].size();
for (int v: adj[u]) cost += calc(v, true).second;
if (mn == true) {
ans_cost = min(ans_cost, cost + abs(sum - l) * w[u]);
} else {
int cur_cost, cur_sum;
if (sum < l) {
cur_cost = cost + abs(sum - l) * w[u];
cur_sum = l;
} else if (sum <= r) {
cur_cost = cost;
cur_sum = sum;
} else {
cur_cost = cost + abs(sum - r) * w[u];
cur_sum = r;
}
if (cur_cost == ans_cost) ans_sum = min(ans_sum, cur_sum);
else if (cur_cost < ans_cost) ans_cost = cur_cost, ans_sum = cur_sum;
}
for(int v: adj[u]) {
cost -= calc(v, true).second;
sum -= l;
pii relax = calc(v, false);
cost += relax.second;
sum += relax.first;
if (mn == true) {
ans_cost = min(ans_cost, cost + abs(sum - l) * w[u]);
} else {
int cur_cost, cur_sum;
if (sum < l) {
cur_cost = cost + abs(sum - l) * w[u];
cur_sum = l;
} else if (sum <= r) {
cur_cost = cost;
cur_sum = sum;
} else {
cur_cost = cost + abs(sum - r) * w[u];
cur_sum = r;
}
if (cur_cost == ans_cost) ans_sum = min(ans_sum, cur_sum);
else if (cur_cost < ans_cost) ans_cost = cur_cost, ans_sum = cur_sum;
}
}
return memo[u][mn] = {ans_sum, ans_cost};
}
void init(vec<signed> P, vec<signed> W) {
n = P.size();
p.resize(n);
w.resize(n);
for(int i = 0; i < n; i++) p[i] = P[i], w[i] = W[i];
adj.resize(n);
for (int i = 0; i < n; i++) if (p[i] != -1) adj[p[i]].push_back(i);
for (int i = 0; i < n; i++) sort(all(adj[i]), [&](int a, int b) { return w[a] > w[b]; });
}
int query(signed L, signed R) {
l = L, r = R;
memset(done, false, sizeof(done));
return calc(0, false).second;
}
# | 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... |
# | 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... |