#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+6;
int n,ans1,a[N],b[N];
struct NODE{
int f,g;
}dp[N];
//f:u点最少下放人数
//g:u子树下放后能返回上级人数
vector<int> e[N];
bool cmp(NODE a1,NODE a2){
return a1.g>a2.g;
}
void dfs(int u,int fa){
vector<NODE> v;
v.clear();
for(auto to:e[u]){
if(to==fa) continue;
dfs(to,u);
v.push_back(dp[to]);
}
dp[u]={a[u],a[u]-b[u]};
v.push_back(dp[u]);
sort(v.begin(),v.end(),cmp);
int ans=0,now=0;
//ans:这颗子树至少下放,now:当前人数
for(int i=0;i<v.size();i++){
if(now<v[i].f){//当前人数不够下放新的子树
ans+=(v[i].f-now);//补全
now=v[i].f;
}
now=now-v[i].f+v[i].g;//更新新的剩余人数
}
dp[u]={ans,now};
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=2;i<=n;i++){
int x,y;
cin>>x>>y;
e[i].push_back(x);
e[x].push_back(i);
ans1+=2*y;
}
cout<<ans1<<" ";
dfs(1,0);
cout<<dp[1].f;
return 0;
}
以及一组 hack:
6
5 9 9 10 10 14
5 1 2 2 2 12
1 2
2 2
2 5
4 1
5 1
std ans:22 26
my ans:22 24