#include "tree.h"
#include <bits/stdc++.h>
using namespace std;
template <typename T>
using pqg = priority_queue<T, vector<T>, greater<T>>;
#define SZ(x) (int)x.size()
int n;
vector<int> p, w;
vector<vector<int>> adj;
void init(vector<int> P, vector<int> W)
{
p = P;
w = W;
n = (int)p.size();
vector ADJ(n, vector<int>());
for (int i = 1; i < n; i++)
ADJ[p[i]].push_back(i);
adj = ADJ;
}
long long query(int L, int R)
{
long long res = 0;
vector<long long> cnt(n, 0);
auto dfs = [&](auto self, int u) -> pair<long long, pqg<tuple<int, long long, int>>>
{
if((int)adj[u].size() == 0)
{
pqg<tuple<int, long long, int>> x;
x.push({w[u], L, u});
cnt[u] += L;
return make_pair(L, x);
}
else
{
long long sum = 0;
pqg<tuple<int, long long, int>> pq;
for(auto i: adj[u])
{
auto x = self(self, i);
sum += x.first;
if(SZ(x.second) > SZ(pq))
swap(x.second, pq);
while(not x.second.empty())
{
pq.push(x.second.top());
x.second.pop();
}
}
long long curr = max(0ll, sum - R);
cnt[u] -= curr;
sum -= curr;
while(!pq.empty())
{
auto [ww, vv, ii] = pq.top();
if(vv == L)
{
pq.pop();
continue;
}
if(ww >= w[u])
break;
if(curr == 0)
break;
long long mn = min({curr, vv - L});
curr -= mn;
cnt[u] += mn;
cnt[ii] -= mn;
pq.pop();
pq.push({ww, vv - mn, ii});
}
pq.push({w[u], sum, u});
return make_pair(sum, pq);
}
};
dfs(dfs, 0);
for(int i = 0; i < n; i++)
res += llabs(cnt[i]) * 1ll * w[i];
return res;
}
# | 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... |