点分治

适用

(·)树上路径类

(·)树上点对

例题

luoguP3806

模板题

加强数据后要先把所有询问离线,每次(solve)挨个子树遍历,然后(tmp[k])表示当前遍历的子树中没有长度为(k)的链,(jud[k])表示曾经遍历的子树中有没有长度为(k)的链,双

指针啥的扫一扫,清空千万别(memset),拿栈存下来手动清空

luoguP4178

用树状数组维护前缀和统计答案

luoguP4149

把统计答案改成(dp)

luoguP2634

每条边权膜(3),统计数量之后(1)(2)拼,(3)自己和自己拼

注意我们要容斥掉在同一子树中拼起来的方案

luoguP2664

(Treeloveswater)大佬的题解啦

对于树上的一点(i),如果(col[i])是在这条链上第一次出现,那么对于其他节点(j(lca(i,j)=rt)),颜色(i)对颜色(j)的贡献是(str[i])

我们考虑容斥统计答案:

(col[x])表示颜色(x)的贡献和,(sum)表示所有颜色总贡献

(dfs)一遍,求出以当前重心为根节点的(col,str,sum)

枚举子树,先清除其中某一子树对(col,sum)的贡献

计算该子树中过根节点路径的信息:

(x=sumlimits_{j=now}^{rt}col[j],num)为当前节点到根的颜色数,(y=str[rt])减去当前整个子树

那么每个节点(ans[now]+=sum-x+num*y)

根节点特判(ans[rt]=sum-col[rt]+str[rt])

原文地址:https://www.cnblogs.com/knife-rose/p/12419374.html