2025.5.8 二南集训树上问题

P9340 [JOISC 2023] Tourism (Day3)

题意:求 \([l,r]\) 内的点构成的虚树大小。

解法一

使用秃子酋长技巧,回滚莫队套 \(O(1) lca\)

解法二

转换贡献思想,常用于扫描线中。

考虑点 \(u\) 什么时候可以产生贡献,发现 \(u\) 在虚树上需要满足 \(2\) 个条件

  • \(dep_u\geq dep_{lca(v)}(v\in S)\)
  • 存在点 \(v\in S\) 使得 \(u\)\(v\) 的祖先。

第一个条件可以求多点 lca 解决。

第二个条件可以树剖,然后用 odt 维护。

若树剖修改到根路径,那么总是会剖成若干链的前缀,所以 odt 可以用栈来代替,获得更优的常数。

S2OJ 树上邻域数颜色

等效节点思想(非题目核心)。

对每个颜色建虚树,新增点使用 dp 等效为一个带初始距离点。

然后建 V 图,暴力拆成若干邻域信息,配合点分树维护邻域即可。

也可以点边容斥,树上两点的邻域交有时可以等效为它们中点的邻域。

P9527 [JOISC 2022] 洒水器

题意:

有一棵树,每个点有个点权

现在有 \(Q\) 次操作:
\(1 X,D,W\):对树上与 \(X\) 距离不超过 \(D\) 的点,把他的点权 \(*=W\)
\(2 X\):查询 \(X\) 的点权

\(N,Q\leq 10^6,D\leq40\)

代表元思想。

仅在查询和修改两点 lca 的深度最小的可行祖先处统计答案,使用暴力跳可以做到 \((n+q)D\) 的复杂度。

云斗 - 做个梦呀做个梦

解法一

使用 kenma 树上二分。

一类特殊的线段树上二分:

线段树上二分通常要求单调性,即布尔值为 \(1111111000000\)\(0000111111\),用于寻找 \(0/1\) 分界,只要求能够快速计算若干个节点所代表的区间的并是否可行。

而 kenma 树上二分不要求单调性,布尔值为 \(001100110100010110\),用于寻找最后一个或第一个 \(1\),要求线段树能够快速判断一个节点所代表的区间内是否存在合法解。

然后暴力树剖即可通过该题。

解法二

利用重链自顶向下做二分。

考虑求重心可以每次往 \(size\) 最大的一个子树跳过去,直到 \(size\) 不超过 \(sum\over 2\)

从根出发,在重链上二分跳到一个临界位置,然后走一个轻儿子,切换重链,继续跳。

解法三

利用重链自底向上做二分。

带权重心可以这样求:排成 DFS 序,求出所有点的点权和 \(sum\),找到第一个前缀和 \(\geq {sum\over2}\) 的点,那么重心就在根到这个点的路径上。

然后向上跳,即可分离 \(\log\)

P7124 [Ynoi2008] stcm

解法一

考虑菊花可以使用缺一分治维护。

考虑对 dfs 序 cdq 分治。

  • 在处理区间 \([l,r]\) 时,只处理子树区间跨过 \(mid\) 的节点,由于子树的 dfs 序要么包含,要么不交,所以它们端点单调,因此复杂度能保证。

  • 然后添加 \([l,mid]\),递归 \([mid+1,r]\)

  • 删除 \([l,mid]\),添加 \([mid+1,r]\),递归 \([l,mid]\)

  • 删除 \([mid+1,r]\)

解法二

如果将分治建成一棵树,那么分治的本质是每次使用 \(O(|ls_u|+|rs_u|)\) 的代价处理 \(ls_u\)\(rs_u\) 之间的贡献,最后实现一个优秀的复杂度。

如果分治树上叶子节点带权,那么最优的分治树应该是一棵哈夫曼树。

这是一个递归套递归的过程,先树剖,我们有如下策略。

  • 考虑处理当前这条重链上所有点的答案。

  • 从上到下暴力添加每个点的轻儿子以及自身,由于树剖后轻儿子子树大小之和为 \(n\log n\),复杂度正确。

  • 删除上一步的所有操作,对重链做缺一分治,分治树上每个叶子权值为原树上它的轻子树大小,然后建哈夫曼树,当递归到分治树叶子时递归处理下一条重链。

整个过程非常特别,类似的题目还有 [GYM102331J]Jiry Matchings - 题解,提交记录在 qoj。

写挂的地方:

想当然的认为一个节点只有最多一个轻儿子,请注意树上节点是多度数的,这是经常容易忽视的地方。

posted @ 2025-07-16 21:30  born_to_sun  阅读(21)  评论(0)    收藏  举报