点分治
对于一棵子树,满足条件的路径包括(经过根的路径,和子树里的路径)!
所以我先以它的根为起点,向下搜索,等到路途的$5$条路径长度$dis[5]$,假设$k=7$,通过$5$条路径的配对有$(2,3,4,5,6,7)$:
排序后,建立双指针$l=1,r=5$,若$a[l]+a[r]\leq k$则$(l,r]$里都成立。这样就只要$O(nlogn+n)$就可以实现找合理路径。
但是显然$(3+4)$这条路径不符合条件,它是$1->3->4与1->3$配对而成(因为我们需要不同一个子树里的路径互相配对),我们需要将他去掉,只需要在继续搜索子树结点时,再次使用以上方法找到子树的$3$条路径,在答案种减去符合的就好了。
但是为了退化到一条链的情况或是有个子树特别大:
假设当前树的重心为$u$,则整棵树的大小为$size(u)$,对于u的任意儿子v有,$size(v)<=size(u)/2$.
也就是说我们每次把重心删除以后,剩下的子树的规模都至少会是源树的一半。如果原来树的大小为$n$,那么递归的层数就会使$log(n)$