树剖
crazy morning
去西之西处,驾驭长风
展开
-
P2486 [SDOI2011]染色
题目 题目 思路 树剖啊,有一个好处,就是样例过了,这玩意就A了…… 这里的线段树需要维护3个东西: 最左边的点的颜色,最右边的点的颜色,颜色段数。 我们发现在统计段数的合并时,需要考虑左右2个儿子拼起来,中间的缝隙两端(即左儿子的右边和右儿子的左边)是否相同,相同段数要-1。 同理,区间查询也需要此操作。 但是,树剖的树上路径查询具有完(丧)美(心)无(病)瑕(狂)的好性质: 路径上的点在线段树上的区间不连续! 导致我们需要把重链顶端及其父节点的颜色比较,相同则结果-1. code: #include&原创 2021-06-12 16:40:08 · 55 阅读 · 0 评论 -
P4114 Qtree1
题目 题目 思路 这里是求边权,而树剖处理的是点权,怎么办? 对偶图 我们考虑在计算完深度以后,把每一条边的边权记成较深点的点权,因为每个点连向其父亲节点的边唯一,所以不会出现重复赋值。 但这样给我们带来了一个问题,u到v上路径最大边权是不能算LCA(u,v)的。 我们经过部分手(jiao)造树及其对应线段树并手(jiao)玩以后,发现在u,v被推到一根重链上时,设u深度浅,则在线段树里的区间即为idu+1id_u+1idu+1至idvid_vidv. 然后树剖即可 code: #include<原创 2021-06-12 09:16:03 · 52 阅读 · 0 评论 -
P3178 [HAOI2015]树上操作
题目 题目 思路 树剖板子,千万记得全部变量都要开long long code: #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; //When I wrote this code,God and I unterstood what was I doing inline lon原创 2021-06-12 08:09:16 · 60 阅读 · 0 评论 -
P3833 [SHOI2012]魔法树
题目 题目 思路 树剖板子,可以单向建边 code: #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; //When I wrote this code,God and I unterstood what was I doing inline long long read()原创 2021-06-12 08:07:46 · 55 阅读 · 0 评论 -
P2146 [NOI2015] 软件包管理器
题目 题目 思路 把依赖关系抽象成树,发现插入操作为: 求根到x的和 把根到x置1 求根到x的和 输出1,3的差的绝对值 卸载操作为: 求x的子树和并输出 把x的子树置0 那就树剖了,上代码 code: #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; //When原创 2021-06-11 20:54:31 · 94 阅读 · 0 评论 -
P3384 【模板】轻重链剖分
题目 题目 思路 树剖终于A了…… 定义: · 重儿子:所有儿子中儿子最多的一个儿子 · 重边:连接2个重儿子的边 · 重链:由重边构成的链 步骤1:先一个dfs,求深度,子树大小,重儿子 步骤2:再一个dfs,按先重再轻的优先级求dfs序,并求每条重链的深度最小的节点,设为top,并将每个节点用dfs序映射到线段树上 步骤3:考虑子树修改与查询,显然,在线段树上,同一子树节点相邻,所以区间修改/查询即可(用到子树大小) 步骤4:考虑路径修改与查询,我们分2种情况讨论: &nbs原创 2021-06-11 19:58:44 · 85 阅读 · 0 评论