点分治与点分树 专题

点分治与点分树 专题

以分治中心为端点的路径称为 “一类路径”,跨过分治中心的路径称为 “二类路径”。

Problem A. CF914E Palindromes in a Tree

一条路径是合法的,当且仅当在其上面的字符中出现次数为奇数的字符种数 \(\le 1\)

于是只需考虑字符的奇偶性,状压记录,路径合法当且仅当其异或和为 \(0\)\(2^k\)

点分治,一类路径直接打树上差分标记,二类路径考虑合并子树时统计它和其他所有子树的贡献。但需要正反做一遍,有点麻烦,所以考虑先将所有点的贡献加上,然后处理每个子树时先撤销,再统计。

时间复杂度 \(O(n|\Sigma|\log n)\)

https://codeforces.com/contest/914/submission/333775803

Problem B. P2664 树上游戏

两个路径不能直接合并,所以需要想想别的办法。

点分治,设当前分治中心为 \(rt\)

一类路径统计是容易的,一遍 dfs 就可以了;

对于一条二类路径 \(x\rightarrow y\),将其拆为 \(x\rightarrow rt \rightarrow y\) 两部分的贡献。

\(x\rightarrow rt\) 的部分是容易的,一遍 dfs 求出;\(rt\rightarrow y\) 的部分,设 \(x\) 位于 \(rt\)\(u\) 子树中,\(cnt_{x,c}\)\(x\) 子树中含有 \(c\) 的路径条数,那么该部分的贡献为 \(\sum_{c\notin S(rt,x)} cnt_{rt,c}-cnt_{u,c}\)

先记 \(S=\sum cnt_{rt,c}-cnt_{x,c}\),然后在 \(u\) 子树中 dfs,当 \(c\) 出现时将其贡献从 \(S\) 里减去。

时间复杂度 \(O(n\log n)\)

https://www.luogu.com.cn/record/230769392

Problem C. P6329 【模板】点分树 | 震波

若没有修改,可以点分治,分成分治区域内和分治区域外两部分计算贡献即可。

加上修改后,考虑点分树,将分治中心的关系用树刻画。

查询 \(x,k\) 时,枚举包含 \(x\) 的分治中心,即点分树上 \(x\) 的祖先。分治中心 \(y\) 的贡献为 \(\sum_{z\in sub_y} a_z[dis(z,x)\le k]-\sum_{z\in sub_{son(y)}} a_z[dis(z,x)\le k]\)\(son(y)\) 表示 \(x\)\(y\) 方向上的儿子。

\(dis(z,x)=dis(y,z)+dis(x,z)\),所以条件变为 \(dis(z,y)\le k-dis(x,y)\) 。后面这一部分可以多维护 \(\sum_{z\in sub_y} a_z[dis(fa_y,z)\le k-dis(fa_y,x)]\) 即可。

在每个节点上开两棵动态开点线段树即可。

记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Problem D. P2056 [ZJOI2007] 捉迷藏

求最远点对,可以点分治求解。

加上修改,需要用点分树。对于每个分治中心,需要维护出每个子节点的子树中到 \(x\) 的距离最大值,和最优子树、次优子树。可以用懒惰删除的大根堆维护。

记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Problem E. P3345 [ZJOI2015] 幻想乡战略游戏

没有修改时,可以类似换根 dp,\(f_v=f_u+w(u,v)(All-2sum_v)\)

那么一定存在一个节点,使得所有儿子的 \(2sum_v\le All\)。这个节点就是带权重心。

以带权重心为根时,越向下走,答案一定越劣。

更改点权后,从旧根开始,每次找到一个更优的儿子,向它走。但复杂度没有保证,所以建出点分树,只需要走 \(\log n\) 步即可。实际上每次从 \(1\) 开始即可。

\(f_x\) 可以枚举分治中心 \(O(\log n)\) 求解。复杂度 \(O(nD\log^2 n)\)

记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Problem F. P3676 小清新数据结构题

拆式子,

\[\begin{aligned}\sum_x(\sum_{y\in sub_x} a_y)^2&=\sum_x(\sum_{y\in sub_x} a_y)(\sum_{z\in sub_x} a_z)\\&=\sum_x \sum_y a_xa_ydep(lca(x,y))\\&=\frac 1 2 \sum_x \sum_y a_xa_y (dep(x)+dep(y)-dis(x,y))\\&=(\sum_x a_x)(\sum_y a_ydep(y))-\frac 1 2 \sum_x \sum_y a_xa_y dis(x,y)\end{aligned} \]

后半部分和根没关系,全局维护。前半部分和后半部分的变化量就是 E 的 \(f_x\)\(O(\log n)\) 查询。

记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Problem G. P4565 [CTSC2018] 暴力写挂

拆式子,

\[f(x,y)=\frac 1 2 (dep(x)+dep(y)+dis(x,y)-dep'(x)-dep'(y)+dis'(x,y)) \]

在第一棵树上点分治,在第二棵树上建虚树,维护虚树上每个节点的子树内最大值、颜色不同的次大值即可。

或者采用边分治,颜色只有黑白两种,虚树上处理时更方便。

记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

posted @ 2025-08-15 17:22  XP3301_Pipi  阅读(11)  评论(0)    收藏  举报
Title