树链剖分 树剖求lca 学习笔记
树链剖分
顾名思义,就是把一课时分成若干条链,使得它可以用数据结构(例如线段树)来维护
一些定义:
重儿子:子树最大的儿子
轻儿子:除了重儿子以外的儿子
重边:父节点与重儿子组成的边
轻边:除重边以外的边
重链:重边连接而成的链
轻链:轻边连接而成的链
链头:一条链上深度最小的点
第一步:进行进行轻重边的划分。
定义size[x]为以x为根的子树节点个数,令v为u儿子中size值最大的节点,那么(u,v)就是重边,其它出边都是轻边
两个重要性质:
1.轻边(u,v)中,Size[v]<size[u]/2 显然,如果儿子v的size>=size[u],则它应该是重边,u的子树中没有size比他更大的
2.从根到某一点的路径上,不超过logn条轻边和不超过logn条重路径。这条性质直接保证了树链剖分的复杂度
进行两次dfs,第一次dfs记录下所有的重边,第二次dfs连接重边,形成重链。
具体过程:在每一个节点,先递归重儿子,沿着重边向下拓展,形成一条重链,接着递归其他轻儿子,成为其子树中重链的起点
定义:
size[]数组:用来保存以x为根的子树节点个数
top[]数组:用来保存当前节点的所在链的顶端节点
son[]数组:用来保存重儿子
dep[]数组:用来保存当前节点的深度
fa[]数组:用来保存当前节点的父亲
dfn[]数组:用来保存树中每个节点剖分后的新编号(按第二遍dfs的访问顺序,先重儿子)
pos[]数组:用来保存当前节点在线段树中的位置

第二步 查询lca
我们象倍增求lca一样,每次跳到一条链的链首,然后跳到链首的父节点,重复前面的过程
直到跳到同一条链上,这时,深度较小的节点就是lca
注意前面的两个性质,它们保证的树剖的复杂度只有很小的logn
代码解释:a^b即a!=b
Dp即dep

树链剖分 树剖求lca 学习笔记的更多相关文章
- 树链剖分与倍增求LCA
树链剖分与倍增求\(LCA\) 首先我要吐槽机房的辣基供电情况,我之前写了一上午,马上就要完成的时候突然停电,然后\(GG\)成了送链剖分 其次,我没歧视\(tarjan LCA\) 1.倍增求\(L ...
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组
Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...
- hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...
- 4.12 省选模拟赛 LCA on tree 树链剖分 树状数组 分析答案变化量
LINK:duoxiao OJ LCA on Tree 题目: 一道树链剖分+树状数组的神题. (直接nQ的暴力有50. 其实对于树随机的时候不难想到一个算法 对于x的修改 暴力修改到根. 对于儿子的 ...
- [POJ3237]Tree解题报告|树链剖分|边剖
关于边剖 之前做的大多是点剖,其实转换到边剖非常简单. 我的做法是每个点的点权记录其到父亲节点的边的边权. 只要solve的时候不要把最上面的点记录在内就可以了. Tree Description Y ...
- Codeforces Round #425 (Div. 2) Problem D Misha, Grisha and Underground (Codeforces 832D) - 树链剖分 - 树状数组
Misha and Grisha are funny boys, so they like to use new underground. The underground has n stations ...
- HDU 5293 Train chain Problem - 树链剖分(树状数组) + 线段树+ 树型dp
传送门 题目大意: 一颗n个点的树,给出m条链,第i条链的权值是\(w_i\),可以选择若干条不相交的链,求最大权值和. 题目分析: 树型dp: dp[u][0]表示不经过u节点,其子树的最优值,dp ...
- Codeforces Round #425 (Div. 2) D 树链剖分 + 树状数组维护区间
一看就知道 可以LCA判断做 也可以树链剖分拿头暴力 然而快速读入和线段树维护区间会T70 于是只能LCA? 线段树的常数不小 于是需要另外一种办法来进行区间加减和查询区间和 就是使用树状数组 这个题 ...
随机推荐
- 自制 yum 源仓库
转自:https://www.cnblogs.com/marility/p/7278374.html 背景 客户服务器为内网机器,centos7系统,且无法与外网连接.需要部署对应的LANMP环境及其 ...
- 微服务中使用MQ——RabbitMQ
概念 什么是消息 消息是指在两个独立的系统间传递的数据.这两个系统可以是两台计算机,也可以是两个进程. 消息是平台无关和语言无关的! 什么是队列 队列是一种数据结构,内部是用数组或链表实现的, 队列的 ...
- 攻防世界RE1 writeup
解题过程 将题目给出的exe文件拖入ida中,查看main函数. 分析函数的逻辑,发现用户需要输出一个字符串,存储到变量v9中.如果v9的值与v5的值相等则会打印unk_413e90中的值,否则打印a ...
- java 设计模式 之 装饰器模式
装饰器模式的作用 在不修改原先对象核心的功能的情况下,对功能进行增强. 增强对象的功能的途径 通过类继承的方式,对父对象进行增强操作,例如造车是父类,改装跑车,跑车加大灯,改装房车,房车加私人电影院. ...
- Google Python Style Guide
https://google.github.io/styleguide/pyguide.html
- Delphi10.2安装过程详解
下载好的Delphi10.2是iso镜像,使用虚拟光驱,快速装载后,提示安装 运行setup.exe安装程序,选择安装语言——点击OK,最好关闭网络和退出其他软件 勾选同意条款,点击next ...
- haproxy配置文件实例
[root@kube-node1 ~]# cat /etc/haproxy/haproxy.cfg global log /dev/log local0 log /dev/log local1 not ...
- RESTful架构(Representational State Transfer资源表现层状态转换)
1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...
- Jmeter 逻辑控制器 之 Switch Controller
一.认识 Switch Controller Switch Controller:开关控制器,通过其下样例顺序数值或名称 控制执行某一个样例 二.通过样例顺序数值控制执行样例 三.通过样例名称控制 ...
- ES6 javascript 实用开发方法技巧分享
定义变量/常量 ES6 中新增加了 let 和 const 两个命令,let 用于定义变量,const 用于定义常量 两个命令与原有的 var 命令所不同的地方在于,let, const 都是块级作用 ...