![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树链剖分
kma_093
山高水闊 苦海無涯
展开
-
浅谈树链剖分
定义 (不严谨的口胡) 树链剖分将一棵树按照某种方式划分成多条链,再利用一系列数据结构对链上信息进行维护。 有什么用? 详见洛谷模板P3384 支持: 求LCALCALCA 路径信息维护 子树信息维护 … 算法实现 怎么实现呢? 因为博主太菜了不会长链剖分,所以这里讲轻重链剖分 据说也有名字叫启发式剖分? 在轻重链剖分中,每个非叶节点有且仅有一个重儿子,其余子节点为轻儿子。轻重儿子划分的依...原创 2019-10-22 22:10:04 · 217 阅读 · 2 评论 -
洛谷P2146 [NOI2015]软件包管理器
题目链接 走这里 题目分析 对不起我就来水个博客 好像这段时间一直很颓,但是什么事情都不干又良心不安,所以就来颓个树剖。 说正事。 最开始做这个题的时候sb了一下,因为虽然可以当做染色染0和1,不知道怎么统计状态变化的软件包的数量,后来发现我们在线段树上维护的\(sum\)的变化值其实就是这段区间状态变化的软件包的数量,然后我们可以偷个懒不用区间查询,直接输出线段树根节点的\(sum\)变化...原创 2019-08-02 17:07:00 · 89 阅读 · 0 评论 -
树链剖分刷题总结
前言 因为\(kma\)过菜导致被数据结构吊打QWQ,这里总结一下做过的树剖题,大概是个一句话题解+记录犯过的睿智错误的地方 染色 传送门 染色 分析 先考虑在线段树上维护区间颜色段的做法:记一下区间左右端点,每次合并上来是左儿子总数+右儿子总数,再判一下中间颜色是否一样决定是否-1 在树上维护同理,注意在跳重链的时候判一下两段重链相邻部分是否颜色一致 博客链接 染色 月下“毛景...原创 2019-07-08 23:36:00 · 111 阅读 · 0 评论 -
[洛谷P3950] 部落冲突
题目链接: 点我 题目分析: 树剖。 考虑把边权下放到点上进行染色,连通是0,不连通是1,然后有两种处理思路: 维护区间颜色段总数(参考另一篇题解:染色),每次查询判断整段内是否只有一种颜色,若是,判断是否是全连通(可能是全不连通) 维护区间最大值,若是0说明是全连通,若是1说明有不连通边 和染色一样,注意跳过LCA 代码: #include<bits/stdc++.h>...原创 2019-06-27 16:54:00 · 165 阅读 · 0 评论 -
[洛谷P3258] [JLOI2014]松鼠的新家
题目链接: 点我 题目分析: 树链剖分 每一次按顺序走到下一个点可以看作沿途的点权+1,注意出发时的点不能+1 代码: // luogu-judger-enable-o2 #include<bits/stdc++.h> #define N (600000 + 5) using namespace std; inline int read() { int cnt = ...原创 2019-06-27 16:12:00 · 65 阅读 · 0 评论 -
[洛谷P4315] 月下”毛景“树
题目链接: 点我 题目分析: 树剖。将边权下放到下方点上(为什么要选深度更深的点?一个父亲可能对应多个儿子,但一个儿子只有一个父亲,即可以保证每个点只保存一条边权)成为经典点权+树剖裸题 注意链计算时不能把LCA算进去,其余细节较多,具体见代码。 代码: #include<bits/stdc++.h> #define N (100000 + 5) #define inf (...原创 2019-06-20 15:44:00 · 78 阅读 · 0 评论 -
[洛谷]P1505 [国家集训队]旅游
题目链接: 传送门 题目分析: 树剖板,支持单点修改,区间取反,区间求最大值/最小值/和 区间取反取两次等于没取,维护一个\(rev\ tag\),每次打标记用\(xor\)打,记录是否需要翻转,\(push\_down\)里判一下如果要取反就\(-=2 * sum(p)\),容易发现新最大值是原最小值的相反数,最小值同理 细节挺多的,看代码 代码: #include <bi...原创 2019-07-08 22:57:00 · 92 阅读 · 0 评论