关于点分治的一些思考:


1.点分治的根本原理是分而治之的思想,更准确的是说人工智能中的与或树问题?

2.点分治的优化源于重心的性质,使得暴力的复杂度得到降低。

3.分治的思想分为找经过当前 r o o t root root的路径和不经过 r o o t root root的路径,不经过 r o o t root root的路径可以分治交给子树处理,因此我们只需计算出经过 r o o t root root的路径即可。

4.在计算某些贡献时,我们通常有两种思路,一种是容斥的思想,第二种是对当前 r o o t root root的不同子树分别计算贡献,一般就是开两个数组维护,有时需要开一个 m a p map map或栈每次清空,消除影响。

5.比如求权值和 ≤ k \le k k的路径数,我们可以双指针计算出经过 r o o t root root的路径数,但是这样的路径可能有两条到根的路径在同一个子树里,因此我们需要容斥掉经过该儿子结点对应的贡献。

6.比如求权值和为 k k k的路径数,就可以开两个数组 t m p [ ] , n o w [ ] tmp[],now[] tmp[],now[],储存当前子树的权值和情况,和其他子树的权值和情况,然后每次计算完当前子树的贡献后,更新 n o w [ ] now[] now[],继续下一个子树,每次 c a l ( ) cal() cal()后要清空 n o w [ ] now[] now[]

7.对于第二种做法,常常有一些细节,比如要计算单链,这时我们需要每次 c a l ( ) cal() cal()时初始化 n o w [ 0 ] = 1 now[0]=1 now[0]=1

8.点分治的难点往往在于如何计算贡献,找到这个问题就解决了。有时需要用到染色,回溯的思想,这类题的比较复杂难想。我就不会,是我太菜了