Something about 树链剖分
声明:部分思路与图片源于OI Wiki
关于树链剖分
树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。
树链剖分有多种形式,如 重链剖分,长链剖分 和用于 $LCT$ 的剖分,大多数情况下,“树链剖分”都指“重链剖分”。
重链剖分可以将树上的任意一条路径划分成不超过$O(\log n)$条连续的链,每条链上的点深度互不相同(即是自底向上的一条链,链上所有点的$LCA$为链的一个端点)。
重链剖分还能保证划分出的每条链上的节点$DFS$序连续,因此可以方便地用一些维护序列的数据结构(如线段树)来维护树上路径的信息。
如:
1.修改 树上两点之间的路径上 所有点的值。
2.查询 树上两点之间的路径上 节点权值的 和/极值/其它(在序列上可以用数据结构维护,便于合并的信息)
除了配合数据结构来维护树上路径信息,树剖还可以用来$O(\log n)$(且常数较小)地求$LCA$。在某些题目中,还可以利用其性质来灵活地运用树剖。
重链剖分
给出以下定义:
定义 重子节点 表示其子节点中子树最大的子结点。如果有多个子树最大的子结点,取其一。如果没有子节点,就无重子节点。
定义 轻子节点 表示剩余的所有子结点。
从这个结点到重子节点的边为 重边。
到其他轻子节点的边为 轻边。
若干条首尾衔接的重边构成 重链。
把落单的结点也当作重链,那么整棵树就被剖分成若干条重链。

实现
做出以下说明:
$Ftr_x$表示节点$x$在树上的父亲。
$Dep_x$表示节点$x$在树上的深度。
$Size_x$表示节点$x$的子树的节点个数。
$Son_x$表示节点$x$的重儿子。
$Top_x$表示节点$x$所在 重链 的顶部节点(深度最小)。
$Dfn_x$表示节点$x$的 $DFS$ 序,也是其在线段树中的编号。
$Rank_x$表示 $DFS$ 序所对应的节点编号,有$Rank_{Dfn_x}=x$ 。
我们进行两遍 DFS 预处理出这些值,其中第一次$DFS$求出 $Ftr_x$,$Dep_x$,$Size_x$,$Son_x$,第二次 DFS 求出 $Top_x$,$Dfn_x$,$Rank_x$。
inline void DFS1(int o)
{
Son[o] = -1;
Size[o] = 1;
for (register int j = h[o]; j; j = nxt[j])
if (!Dep[p[j]])
{
Dep[p[j]] = Dep[o] + 1;
Ftr[p[j]] = o;
DFS1(p[j]);
Size[o] += Size[p[j]];
if (Son[o] == -1 or Size[p[j]] > Size[Son[o]])
Son[o] = p[j];
}
}
inline void DFS2(int o , int t)
{
Top[o] = t;
Dfn[o] = ++Cnt;
Rank[Cnt] = o;
if (Son[o] == -1)
return;
DFS2(Son[o] , t);
for (register int j = h[o]; j; j = nxt[j])
if (p[j] != Son[o] and p[j] != Ftr[o])
DFS2(p[j] , p[j]);
}
重链剖分性质
树上每个节点都属于且仅属于一条重链。
重链开头的结点不一定是重子节点(因为重边是对于每一个结点都有定义的)。
所有的重链将整棵树 完全剖分。
在剖分时重边优先遍历,最后树的$DFN$序上,重链内的$DFN$序是连续的。按$DFN$排序后的序列即为剖分后的链。
一颗子树内的$DFN$序是连续的。
可以发现,当我们向下经过一条 轻边 时,所在子树的大小至少会除以二。
因此,对于树上的任意一条路径,把它拆分成从$LCA$分别向两边往下走,分别最多走$O(\log n)$次,因此,树上的每条路径都可以被拆分成不超过$O(\log n)$条重链。
(待更新)
Something about 树链剖分的更多相关文章
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)
题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...
- 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)
题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...
- 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)
题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...
- bzoj2243树链剖分+染色段数
终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...
- bzoj3631树链剖分
虽然是水题1A的感觉太爽了O(∩_∩)O~ 题意相当于n-1次树上路径上每个点权值+1,最后问每个点的权值 本来想写线段树,写好了change打算框架打完了再来补,结果打完发现只是区间加和单点查 前缀 ...
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
随机推荐
- 个人博客开发之blog-api项目统一结果集api封装
前言 由于返回json api 格式接口,所以我们需要通过java bean封装一个统一数据返回格式,便于和前端约定交互, 状态码枚举ResultCode package cn.soboys.core ...
- viewport深入理解和使用
什么是viewport ? viewport是用户网页的可视区域,也可叫做视区.手机浏览器是把页面放在一个虚拟的窗口(viewport)中,通常这个虚拟的窗口比屏幕宽,这样就不用把网页挤到很小的窗口中 ...
- stream之map的用法
一.Stream管道流map的基础用法 最简单的需求:将集合中的每一个字符串,全部转换成大写! List<String> alpha = Arrays.asList("Monke ...
- Day10 类与对象-面向对象编程(1)
面向对象编程(OOP) 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据. 抽象 三大特征: 封装 继承 多态 从认识论角度考虑是先有对象后有类.对象,是具体的事物.类,是抽象的, ...
- 【LeetCode】283.移动零
283.移动零 知识点:数组:双指针: 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例 输入: [0,1,0,3,12] 输出: [1, ...
- Linux CentOS 7 在Apache服务器上安装SSL证书
在开发微信小程序的时候,wx.request请求的地址必须是https的,所以只能重新配置服务器. 域名和服务器都是在阿里云上买的,系统是CentOS7,安装了Apache服务器.网上也找了一下,很多 ...
- 最大流最小割——bzoj1001狼抓兔子,洛谷P2598
前置知识 平面图 平面图就是平面上任意边都不相交的图.(自己瞎画的不算XD) 对偶图 比如说这个图,我们发现平面图肯定会把平面分成不同的区域(感觉像拓扑图),并把这些区域当做每个点(不被包围的区域独自 ...
- [CEOI2002]Bugs Integrated, Inc. 题解
又是一道神仙题,又是题解看不懂-- 好时代,来临力-- 时隔一个世纪来补题解了-- 之前太垃圾了,脑子有点问题,所以没看懂题解.今天再看这道题虽然还是很毒瘤,但也没有想象得那么难. 先观察芯片的形状, ...
- 深入刨析tomcat 之---第21篇 tomcat 对jsp页面支持的实现原理
writedby 张艳涛 web技术,以前的动态网页技术多是jsp页面,比如点击一个菜单目录,直接访问了一个LRJSDetailInput.jsp页面,这个页面 有<html><bo ...
- Laravel Ignition 2.5.1 代码执行漏洞(CVE-2021-3129)
影响范围 Laravel 框架 < 8.4.3 facade ignition 组件 < 2.5.2 poc git clone https://github.com/simonlee-h ...