思路
很显然对于任意一个点u,如果有一个点v满足dist(v,u)<=a[u],那么v到u路径上的所有点都是满足条件的点。所以我们考虑二分(也可以倍增),找到第一个符合条件的点。然后我们使用树上差分来统计结果。我们令所有点ans=1,再对符合条件的点的父亲我们ans—,最后dfs的时候从子节点往父节点合并答案即可。注意最后答案要ans-1,因为初始ans=1即自己被多统计了一次。
代码
1 |
|
真彩希帆のファン
很显然对于任意一个点u,如果有一个点v满足dist(v,u)<=a[u],那么v到u路径上的所有点都是满足条件的点。所以我们考虑二分(也可以倍增),找到第一个符合条件的点。然后我们使用树上差分来统计结果。我们令所有点ans=1,再对符合条件的点的父亲我们ans—,最后dfs的时候从子节点往父节点合并答案即可。注意最后答案要ans-1,因为初始ans=1即自己被多统计了一次。
1 | #include <bits/stdc++.h> |