树链剖分 树剖求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? 线段树的常数不小 于是需要另外一种办法来进行区间加减和查询区间和 就是使用树状数组 这个题 ...
随机推荐
- bash基础之三配置文件
一.shell的两种登录方式: 1.交互式登录:(1)直接通过终端输入账号密码登录(2)使用“su - UserName” 或“su -l Username”切换的用户执行顺序:/etc/profil ...
- Spring Cloud Gateway(一):认识Spring Cloud Gateway
1.Spring Cloud Gateway 简介 Spring Cloud Gateway 系列目录 Spring Cloud Gateway(一):认识Spring Cloud Gateway S ...
- Spring Cloud Eureka(六):Eureka Client 如何注册到Eureka Server
1.本节概要 根据前文我们对Eureka Server 有了一定的了解,本节我们主要学习Eureka Client 与 Eureka Server 如何通讯的及相关通信机制是什么,本文会弄清楚一下几个 ...
- 调皮捣蛋的Linux下有趣终端的合集
*本文作者:国光,转载自 FreeBuf.COM,原文地址:https://www.freebuf.com/news/144050.html 前言 刚开始接触Linux的我们,肯定认为Linux系统就 ...
- phpstorm+xdebug安装配置
这个问题也困惑了我好久 烦死了 今天看了qing师傅的博客 跟着安装 运行环境: phpStorm 2018 PHP 5.45 nts VC9 Xdebug 2.4.1 0x01 PHP安装xdebu ...
- ICEM—奇葩
原视频下载地址:https://yunpan.cn/cSsbI89zP9Z4K 访问密码 a287
- Windows下使用cmd运行jar文件
一般window系统下是不能直接运行jar文件的.(有些电脑可以,记得我以前的电脑是双击jar就可以运行的) 那么如何在windows下运行jar呢? 1.首先,电脑必须配置java运行环境jre-- ...
- mongodb 报错 not authorized on admin to execute command【 version 3.2.18 】
mongodb version 3.2.18 测试问题: 分析: 从报错内容上看是权限不够,但不明了为什么,因为已经使用的超级用户权限: { "_id" : "admin ...
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_17-异常处理-可预知异常处理-异常处理测试
ResultCode有很多的实现类 cmsCode有很多类型的错误异常 pgeService内当CmsPage这个对象为空的时候,异常类型就可以抛出CmsCode里面的错误代码 if(cmsPage1 ...
- Docker save and load,镜像保存
一.起因 docker pull 时发生错误 error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/r ...