首先为了方便,把 0 当成 −1 来看。这样只要边权和为 0 即可算阴阳平衡。
找重心然后求所有点到分治重心的边权和,然后记录每一个点 x 是否可以在其到重心路径上找到一个点 y 使得 x,y 路径阴阳平衡,记为 validx。
考虑统计路径时两个点到重心的路径能拼成合法路径的条件:
- 不在同一棵子树。
- 其中一个点 valid 值为真。
- 整条路径阴阳平衡。
整条阴阳平衡并且一半阴阳平衡那么另一半肯定也阴阳平衡,所以可以如此统计。
求 valid 和合并路径时都可以记录每个 dis 对应多少个点。
注意若干细节特判。
代码:
1 |
|