据说可以树形 DP O(n) 过去?
反正我喜欢点分治!
由于题目限制的仅是 3 的余数(当然开到 105 点分治也可做),所以我们可以对于距离除以 3 的余数 0,1,2 来统计。
即,设 cnt0/1/2 表示距离膜 3 为 0/1/2 的点的个数。
那么对于结点 p,把答案加上 cntx(disp+x≡0(mod3),0≤x<3)。
显然 x 就是 −dispmod3。
然后有一些细节,比如到当前分治的点的路径只会被统计一次,
所以我们干脆只统计 x<y 的 (x,y) 的个数,并在输出时乘 2 加 n。
代码:
1 |
|