树链剖分简述

最近学了树链剖分,就讲讲吧
(主要是为了以后复习用) In 2017.4.9

**树链剖分是个很复杂的算法,
即使是很经典的模版题,也有一百多行,,**

因此学这个算法耗费了很多时间,
把以前学过的算法基本组合在了一起,
树链剖分的基本思路就是:
一般树链剖分都是求两个节点之间的路径经过的节点之和,一看到区间便可以使用数据结构来维护,例如线段树和树状数组,这里就用线段树来维护。
但线段树只能维护线性的,而树并不是线性的,
所以就把树分成很多线性结构,,分重链和轻链
然后通过两次初始化的DFS构建链、
第一次记录下深度和所有的重边,
第二次构建重链和其在线段树中的位置,
然后利用线段树维护区间结构,

转化模型:
如果给出的是点权,那么是最简单的:
1、更新点的点权
其实就是对应线段树中的单点修改
2.更新某个节点为根的子树所有点的点权
这个我不是很懂Orz,到时候懂了之后再回来补
3.求两点之间的路径经过的节点之和或最大值
类似LCA的形式,
如果两点在一条链上,直接利用线段树求区间和和求最大值就行了;
但如果不在的话,就得尽量把他们迁移到一条链上,
结合LCA的思想:找到深度大的往上跳到链的顶端的父亲,那么整条链就走完了(其中区间和 和最大值均可以求,因为在一条链上)
然后再找到深度大的点往上跳

给边权就得稍微修改一下:
用边的孩子节点来表示该边,这样就能圆满解决此类问题

你可能感兴趣的:(竞赛,------树链剖分,----树)