标签:相对 完全 复杂 两种 很多 算法 除了 最短路 更新记录
说实话在很长一段时间内都对于点分治算法感觉到比较的害怕。主要是感觉它的复杂度非常的高,而且莫名给我留下了一种点分治是有板子的印象。实际上是没有的。而点分治由于将一棵树每次都尽量地划分为了相对平均的几块,所以就算代码写起来复杂度非常的高,效率往往而言也还是比较可观的。如果在考试的时候遇到点分治的题目,个人认为就算不能写出正确复杂度的解法,暴力点分一样值得拥有啊~(主要是可能比一些其他的奇怪的暴力更为好写)。
点分治主要用于处理与树上路径相关的问题。主要的思想在于:对于一个点 \(u\) 而言,所有的路径都只有两种可能:经过该点的和不经过该点的。这样我们在遍历到一个点的时候,统计出所有经过它的路径的答案,在此后我们就可以认为这个点不会再有用处,丢掉就好了。如何统计答案,则会与很多其他的算法相结合,鉴于本人做过的题目数量与难度均有限,目前来说一般而言是与dp或容斥相结合处理。(这里就充分的体现出点分治的优越性:暴力的统计方法用点分治带可以飞)。
实际上,除了分治的部分,剩下的完全可以看做是一个新的题目,例如树形dp之类(还是很常见的)。例如 IOI2011 race 和 FJOI2014 最短路径树都是一样的,这里有一个技巧:为了防止同一棵子树内的点对当前分治点产生贡献,我们可以先统计答案,再更新记录的数组。(类似01背包优化,用于统计与当前子树内的路径构成的路径的答案时,这个子树的路径尚未被包括进来。)而WC2010 重建计划中,我也是运用了一个非常暴力的方法。很奇怪的WA了一个点,不过对于暴力算法来说也还是心满意足了~
标签:相对 完全 复杂 两种 很多 算法 除了 最短路 更新记录
原文地址:https://www.cnblogs.com/twilight-sx/p/9256414.html