思路:
我们可以发现叶子节点是一定要染的,如果从下往上染没染过的点,不一定是最优的,所以对于其他的结点,我们更新最大染色范围,如果该结点的子节点可以染色到它的话,那么他就不需要再染色,否则它就需要被染色,同时选择子节点内范围最大的点染色,更新最大范围。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector<int> v[N];
int n, res, k[N];
int dfs(int x, int fa) {
int sum = 0;
for (auto now : v[x]) sum = max(sum, dfs(now, x));
if (!sum) {
res++;
return k[x] - 1;
}
k[fa] = max(k[fa], k[x] - 1);
return sum - 1;
}
int main() {
cin >> n;
for (int i = 2; i <= n; i++) {
int x;
cin >> x;
v[x].push_back(i);
}
for (int i = 1; i <= n; i++) cin >> k[i];
dfs(1, 0);
cout << res << endl;
return 0;
}

京公网安备 11010502036488号