自己胡的,但是貌似会出现比答案小的情况?想了一下没搞懂做法哪里有问题。大佬帮帮qwq
#include <bits/stdc++.h>
using namespace std;
#define int long long
// #define double long double
int n,m;
int l[600400],r[600400],w[600400];
int c[600400];
inline int f(int u,int x){
if(x>r[u])return w[u]+x-r[u];
else if(x<l[u])return w[u]+l[u]-x;
else return w[u];
}
vector<int>g[600400];
inline void dfs(int u){
priority_queue<int,vector<int>,greater<int>>q;
int ct=0;
for(int v:g[u]){
dfs(v);
q.push(l[v]);
q.push(r[v]);
ct++;
}
if(!q.empty()){
while(--ct)q.pop();
l[u]=q.top();
q.pop();
r[u]=q.top();
for(int v:g[u])w[u]+=f(v,l[u]);
}
l[u]+=c[u],r[u]+=c[u];
// cout<<u<<" "<<l[u]<<" "<<r[u]<<" "<<w[u]<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
// int C=clock();
// freopen("genshin.in","r",stdin);
// freopen("genshin.out","w",stdout);
cin>>n>>m;
for(int i=2;i<=n+m;i++){
int p;
cin>>p>>c[i];
// cout<<p<<" "<<i<<" "<<c[i]<<endl;
g[p].push_back(i);
}
dfs(1);
cout<<w[1]<<endl;
cout.flush();
return 0;
}