目录
一、树链剖分相关概念
1.为啥要剖分
1.可以维护树路径上的信息(维护)
2.将一棵树划分成若干条链,用数据结构去维护每条链,复杂度为 O ( l o g N ) O(logN) O(logN)。(复杂度低)
2.轻边和重边
将树中的边分为:轻边和重(zhong)边
定义 s i z e ( x ) size(x) size(x)为以 x x x为根的子树的节点个数。
令 v v v为 x x x的儿子节点中 s i z e size size值最大的节点,那么边 ( x , v ) (x,v) (x,v)被称为重边,树中重边之外的边被称为轻边。
我们称某条路径为重路径(重链),当且仅当它全部由重边组成。
变量的声明:(可能有点复杂)
const int N=1e5+10;
struct edge
{
int nex,to;
}e[2*N];
struct Node
{
int sum,lazy,l,r,ls,rs;
}node[2*N];
int rt,n,m,r,a[N],cnt,head[N],f[N],d[N],size[N],son[N],w[N],top[N],id[N];
接下来讲解一下含义:
f [ x ] f[x] f[x]: x x x的父亲节点( f a t h e r [ x ] father[x] father[x])
d [ x ] d[x] d[x]: x x x的深度( d e e p [ x ] deep[x] deep[x])
s i z e [ x ] size[x] size[x]:以 x x x为根的子树节点个数(上面讲过)
s o n [ x ] son[x] son[x]:存储 x x x的重儿子
w [ x ] w[x] w[x]: 保存当前 d f s dfs dfs标号在树中所对应的节点(与i d [ x ] d[x] d[x]相对应)
t o p [ x ] top[x] top[x]:保存当前节点所在链的顶端节点
i d [ x ] id[x] id[x]:保存树中每个节点剖分以后的新编号( d f s dfs dfs的执行顺序)
注意:如果一个点的多个儿子所在子树大小相等且最大,那随便找一个当做它的重儿子即可。叶节点没有重儿子,非叶节点有且只有一个重儿子。
3.轻重边路径剖分的性质
1.轻边 ( x , v ) , s i z e ( v ) < = s i z e ( x ) /