点分治总结:
1.求合法路径条数的问题
选定一个根节点,那么答案可分为经过根节点的和不经过根节点的
答案之和。
对于不经过根节点的我们递归去处理。
所以考虑如何解决经过根节点的答案。
我们可以统计出当前根节点的所有子节点距离根节点的距离。
此时就相当去求任意两个点对的距离满足要求的点对数。
但是点对不能在同一个子树里。
然后通过排序或者hash记录答案。。。
这样还不对,会有重复。比如因为当前点的某一棵子树内部合并
也符合答案,
例如:
我们求以root为根的答案的时候,可能会因为root到A和root到B的合并(即A和B的合并)也符合要求所以会对答案造成影响,所以我们要减去因同一个子树中两条路径(点对)合并得到符合要求的路径对正确答案的影响。
所以我们要减去子树中两条路径合并的答案。
可以发现,子树中两条路径合并的答案就是一个递归处理子树的过程。
我们把a-b的交点c距离root的路径传如对c的子树节点距离C的距离的计算中。
这样相当于C的所有子节点的距离都增加了root到C的距离。
这样我们再求任意两个点对合并的距离的时候求得的就是同一个子树C内两个点对合并的影响。
比如root到c等于6 C-D=4。
假设求路径等于10.
但是root->c+c->d也符合要求。
但是我们再重新计算D到C的距离是我们给他加上6
在算C的子树中两两点对合并的距离等于10的时候我们会将CD加上,所以我们减去C这颗子树的答案即为所求。
图片来自:https://baijiahao.baidu.com/s?id=1608747083240620752&wfr=spider&for=pc