浅析树链剖分Orz
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析树链剖分Orz相关的知识,希望对你有一定的参考价值。
本文思路参考自何开大佬
引子
相信各位大佬一定会线段树这种非常实用的数据结构
那么如果我们要维护一棵树上的链的权值的时候怎么办
就比如说BZOJ1036树的统计这道题目
可能诸位草率地想想线段树是可以口头AC的,But 这是在一棵树上,线段树支持的连续的区间操作
在这棵树上,如果链的编号断断续续,那么我们的线段树就和暴力没有什么区别有一点点区别了
概念
所以这里就需要用到树链剖分,这种可以支持树上链操作的数据结构
树链剖分有很多高大上的名词需要我们去记
我们先定义一些概念东东
size[u]表示以u为根的树的大小
dep[u]表示u的深度(根的深度定为1)
fa[u]表示u的爸爸(???)
有了这些东东,我们开始定义真正的概念
重儿子:u的所有儿子v中,size[v]最大的v称为u的重儿子
轻儿子:u的所有儿子v中,不是重儿子的都被叫做轻儿子
重边:u 连向它的重儿子的边称为重边
沁轻边:u连向它的轻儿子的边称为轻边
重链:组成这条链的所有的边都是重边
沁轻链:组成这条连的所有边都是轻边
一些小性质
性质1:V为u的轻儿子,则必有size[V] <= size[u] / 2
这个性质证明可以用到反证法
如果存在V为轻儿子并且size[V] > size[u] / 2
我们会发现如果一个节点成为重儿子的条件就是size[V] >= size[u] / (SonNumber[u]) //SonNumber[u]表示u的儿子的数目
因为size[u] / 2 > size[u] / 3 > size[u] / 4 ………………………………
而且size[V] 是不可能大于size[u]的
所以,V为这时候只能为重儿子
与假设不符
证毕~~~~
性质2:从根到某一节点的路径上,轻边的数量不超过O(log N),重链的数目不超过O(log N)
这个我们也是可以证明的
因为我们可以从性质1直接推得轻边的数量不超过O(log N)
后来我们发现
没存在一条轻边,就会出现两条重链
所以重链的数量不超过O(log N)
证毕~~~~
操作
以上是关于浅析树链剖分Orz的主要内容,如果未能解决你的问题,请参考以下文章