点分治入门(二)
题目链接:bzoj 2599
题意:写 B z o j 的题意就是简单——题意见上……
题解:首先我们在大体上使用点分治的做法,然后考虑每一层如何做。在这里我选择了数组指针扫描法:假设扫描时两个指针指向了 X、Y 两个点,那么我们需要让 W[X]+W[Y]=K 而且 B[X]≠B[Y],这时用该路径的边数更新答案即可。这时我们发现,如果左指针确定后,满足 W[X]+W[Y]=K 的右指针的范围对应一个权值区间。为了避免枚举这些左指针时,对于右指针的区间重复枚举,可以对每个区间记录路径边数的最小值和次小值,且保证这两个值所对应的 Belong 不一样。这样在枚举左指针时,可供选择的右指针不是最小值就是次小值。
我思故我在:点分治的题目,一如既往的难在对于每一层的状态的处理上。这次又被坑了不少时间:既然选择要记录每一个权值区间的边数的最小次小值,那么就一定得处理好这两个值之间的 Belong 的关系。我错在了直接给次大值赋值的时候,忘记去判断新的次大值的 Belong 是否与最大值的不同,导致Wa了两次。⊙__⊙b汗~