树链剖分详解

一、树链剖分相关概念

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 ) /

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值