CF 682C
- 水题,一开始看错题了,orz。
- 就是求有多少个点之间的边权值大于深度低的那个点的点权值。
- 每次dfs的时候如果上面的边权值为负了,那么取0再往下传就行。
#include <cstdio>
#include <vector>
#include <utility>
#include <cstring>
#include <iostream>
#include <algorithm>
const int maxn = 100007;
int ver[maxn], size[maxn], n;
std::vector<std::pair<int, long long> > lis[maxn];
void getSize(int u, int f){
size[u] = 1;
for(auto i : lis[u]){
int v = i.first;
if(v == f) continue;
getSize(v, u);
size[u] += size[v];
}
}
int ans = 0;
void dfs(int u, int f, long long val){
if(val > ver[u]) {
ans += size[u];
return;
}
for(auto i : lis[u]){
int v = i.first;
if(v == f) continue;
dfs(v, u, std::max(val + i.second, i.second));
}
}
int main()
{
int u, val;
std::cin >> n;
for(int i = 1; i <= n; i ++){
std::cin >> ver[i];
}
for(int i = 2; i <= n; i ++){
std::cin >> u >> val;
lis[i].push_back(std::make_pair(u, val));
lis[u].push_back(std::make_pair(i, val));
}
getSize(1, 1);
dfs(1, 1, 0);
std::cout << ans << std::endl;
}