点分治入门(一)
题目链接:poj 1741
题意:求树上距离小于等于 K 的点对有多少个。
题解:首先求出几个数组,我们假设每一个点在树中的深度为 W[i] ,以及每个点在 Root 的哪一个子节点的子树中,记为 Bi。把树中的点都取出来,按照 W[i] 升序排序。只需要用两个指针 X、Y 一个从前一个从后开始扫描统计答案即可,对于左指针 X 找到最靠右的右指针 Y 满足 W[X]+W[Y]≤K ,设 DP[i] 表示在左右指针之间的满足 B[X]=i 的点 X 的个数,这时 Y-X-DP[B[X]] 就是要求的答案。
我思故我在:点分治的重点在于对每一层状态的处理。这个的题目给我的教训是如何做到在不用 Memset 的情况下对于状态数组的还原和改变。还有就是我一开始没有想到如何正确的维护 DP 数组,还愚蠢的用了前缀和来计算,导致空间开不下而爆炸。