省选集训—树上技巧选讲 by zdj
树链剖分的扩展方法
树链剖分一些扩展性质:
- 基于重标号的深度优先搜索优化的树链剖分算法
- 轻重边分治处理思想‘
- 重边批量修改,轻边用了再查
NOI 轻重边
染色的方法比较神奇,我们考虑不这样处理。
其实还是相当于对于每个点以及其邻接点的转化,不妨让每个点代表其到父亲的边,并标记其是否是重边。
那么相当于给这条链上(不包括 lca) 赋值为
考虑标号时,先标记整条重链,然后从下往上/从上往下将链上的点的邻接点也标号。
这样就满足了一条重链除了链头之外,重链标号连续,重链的某个子段的邻接点标号连续。
那么就可以线段树暴力覆盖了,注意跳轻边的时候特别处理跳过去的重儿子。
集训队互测-简单树剖练习题
重链剖分,再用一个树状数组维护树上差分便于查找某个点的点权。
这样可以直接
我们考虑批量维护重边权值,而单独查询轻边权值
那么一次修改,重边权值批量变化
那么一次查询,只会查询
维护即可。
集训队互测-线段树与区间加
注意到一次操作在首次分裂成两半递归后,以左边的递归为例,每次走左儿子,那么就是给右儿子批量修改。
并且
考虑 懒标记的下传,本质上是将每个点的懒标记变为到树根的懒标记的和
所以这启发我们不维护真实的懒标记值,而是维护每个点到树根的懒标记的和。
那么就相当于是子树加了(也就是往左走的给所有往左走时的右儿子子树加)
然后我们考虑怎么通过这个东西得到答案。
这就行了。
可以重链剖分,然后先整体递归走左儿子非重儿子的左儿子,最后整体递归走右儿子非重儿子的右儿子。
这样我们可以保证:重链除了链头编号连续,重链上所有点的左非重儿子树编号连续,右非重儿子树编号连续。
因此可以
处理一车细节后可以通过。
树上杂题
CF1585G
显然的 SG 题目。
根据长链剖分的相关结论,我们只需要快速计算仅有一个儿子的节点的 dp 值即可,且这本质上与在计算
至于有多个儿子的时候,我们只在乎其最浅儿子深度的这些点的 dp 值,如果可以合并这些结果就好了。
这是容易的,可以直接暴力合并,根据长链剖分,复杂度正确。
然后暴力计算就好了(SG值显然不会超过
CF772E
动态维护
并且图三度化,那么可以点分治这个LCA的寻找,然后查找到
细节比较多,需要注意实现。
永恒
考虑到
那么问题就变成了对于每个Trie树上的点
现在考虑转化为没有祖孙关系的问题,可以使用点分治,我们只需要单独处理当前分治中心对所有点的贡献,剩下的贡献都可以当作
注意啊,这个
那么这就容易了,将连通块内点建立虚树,然后暴力统计,至于
CF1930G
很唐啊,一直在想怎么在树上搞,但是事实说明计数题只需要充要条件,树形结果只是附加。
设
目标
考虑
, 不小于 的最大值。- 根到
的路径中, 编号最大。 是 的 方向上子树里最大的点
可以考虑将每个点的儿子按照子树内编号最大值从小到大排序,然后做
CF1876E
考虑一个特殊情况:外向树,这种情况每条边都可以赋值为一个颜色。
考虑将原图等效为一个外向树的图。
贪心地,如果我们定根将无向边全部变为外向边,考虑这时候的内向边会起到什么作用呢?
事实上就是将其与指向它的外向边染为同一个颜色,然后就等效为一个外向边了。
那么定根后的最大颜色数事实上还是外向边条数。
则这样可以快速换根求出答案,然后做一次 dfs 模拟进行染色就好了。
一个可能的疑问是如果我们找到了一个内向边,但是栈空了怎么办。
事实上这是不可能的,因为我们将两个点作为根的方案反转,只会影响这两个点之间的路径,因此最优的根,一定到每个点的路径上外向边不少于内向边,因此栈不可能为空。
CF1930H
首先答案是不在路径上的点的点权最小值。
我们问题化为将树进行两次标号,并使用这两次标号的结果将树上除掉这条路径的图划分为不超过
使用入栈序和出栈序,画图不难发现。
「CEOI2022」Drawing
可以有一个
并且第
这样做是 nth-element
技术可以做到
优化划分过程,但是很遗憾的是用不了点分治(因为该点分治划分后分治中心并没有钦定)
一个神奇的想法是做链分治
递归处理,先拿出一整条重链,找到一个重链上的
这样分治下去只有几种情况:当前点集,我知道链头的代表点/我知道链头和链底的代表点。
考虑将链底与链头的两个点取凸包上相邻的两个点,这样可以保证点集的划分。
接着我们如何确定
那么取
至于
这样一定可以满足三角形内无点,且可以划分出对应大小个的点。
同时
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!