点分治
Posted knife-rose
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点分治相关的知识,希望对你有一定的参考价值。
适用
(·)树上路径类
(·)树上点对
例题
模板题
加强数据后要先把所有询问离线,每次(solve)挨个子树遍历,然后(tmp[k])表示当前遍历的子树中没有长度为(k)的链,(jud[k])表示曾经遍历的子树中有没有长度为(k)的链,双
指针啥的扫一扫,清空千万别(memset),拿栈存下来手动清空
用树状数组维护前缀和统计答案
把统计答案改成(dp)
每条边权膜(3),统计数量之后(1)和(2)拼,(3)自己和自己拼
注意我们要容斥掉在同一子树中拼起来的方案
扒(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])
以上是关于点分治的主要内容,如果未能解决你的问题,请参考以下文章