SOJ1658 大群·树 题解

题意

传送门

给定一棵树,求选 \(3\) 个不同点使得两两之间距离小于等于 \(k\) 的方案数。

\(3 \le n \le 10^5,1 \le k \le 10^5\)

题解

学到了点分树的一种新用法,来记一下。

对于合法的 \(3\) 个点,它们之中最长路径一定包含最深的点。正确性显然。于是我们得到一种朴素做法:按照深度依次加入所有点,并在加入时统计距离它小于等于 \(k\) 的点个数 \(cnt\),则答案加上 \(\binom{cnt}{2}\)

考虑用点分树优化。因为点分树上的距离不代表实际距离,所以我们对每个节点建立一棵线段树:当加入一个点时,在它到根路径上的所有点的线段树上分别\(dis(x,i)\);当查询时,查询它到根路径上所有点的线段树上 \(\le k-dis(x,i)\) 的个数。其中 \(dis(x,i)\) 表示加入的点与其到根路径上点的距离,在构造点分树时可以解决。

此时还有一个问题:查询时会算重,因为实际上不需要加入与此点在 \(i\) 同一棵子树中的 \(\le k-dis(x,i)\) 的点。我们在其子节点上用另一颗线段树维护这个信息,并减去即可。

因为点分树上深度为 \(O(\log n)\),故复杂度为 \(O(n \log^2 n)\)

好像讲的不是很清楚……但反正这博客也没人看,将就一下吧。

posted @ 2022-10-25 19:22  realFish  阅读(38)  评论(0)    收藏  举报