点分治
概念
树的点分治是一种解决一类树上路径问题的算法,复杂度大概是O(NlgN)的.
主要操作有findroot cal solve函数,根据题意还可以加其它的函数
主要是每次利用树的重心最大size的子树不超过n/2的性质达到lg的时间复杂度
然后在子树之间统计
模板
1.findroot
这个应该比较简单,找树的重心,维护点size然后求max,最后n-size[x]代表它父亲那块的子树的size
void getroot(int poi,int lst)
{
son[poi]=1;f[poi]=0;
for(int i=last[poi];i;i=e[i].lst)
if(e[i].to!=lst && !vis[e[i].to])
{
getroot(e[i].to,poi);
son[poi]+=son[e[i].<