题目大意:
从1到各个叶子节点,填数到给定的区间,求最少多少次完成
//AC 代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
int father[maxn];
ll l[maxn], r[maxn];
vector<int>son[maxn];
ll f[maxn];
int ans;
void dfs(int s){
int se = son[s].size();
if(se == 0){
f[father[s]] += r[s];
ans++;
return;
}
for(int i = 0; i < son[s].size(); i++){
int v = son[s][i];
dfs(v);
}
ll val = min(f[s], r[s]);
if(val < l[s]){
ans++;
f[father[s]] += r[s];
}else{
f[father[s]] += val;
}
}
int main(){
int n, t;
cin>>t;
while(t--){
cin>>n;
for(int i = 0; i <= n; i++){
f[i] = 0;
son[i].clear();
}
int p;
ans = 0;
for(int i = 2; i <= n; i++){
scanf("%d", &p);
father[i] = p;
son[p].push_back(i);
}
father[1] = 0; son[0].push_back(1);
for(int i = 1; i <= n; i++) scanf("%lld%lld", &l[i], &r[i]);
dfs(1);
cout<<ans<<endl;
}
return 0;
}