码迷,mamicode.com
首页 > 其他好文 > 详细

树链剖分

时间:2020-06-08 10:59:00      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:技术   info   好处   tps   问题   区域   使用   width   com   

O 树链剖分的本质是把一棵树映射到线段上,且树被剖出来的链是连续的一段。看下图:

 

技术图片

 

树剖的方法是先剖重的,这样dfs,并记录时间戳,也就是dfs序的序号。上图映射到线段上就是:

 

技术图片

 

其中加括号的区间是重链部分。

O 那么这样做有什么好处?

比如我们要将树上某一路径x到y(比如7点-13点)上的点权值都+z,可以转化为在序列上进行。方法是:首先判断两个点的top[]是否相同,如果相同说明就在一个重链上,直接用线段树去处理。如若不然,判断dep(top[7])和dep(top[13]),即两个点的top[]值的深度。深的为7,浅的是13,那么先计算7-top[7],将该区间+z,区间更新使用线段树。走到top[7]后,将x = fa[top[7]],跳到1号点。重复判断两个点的top[]是否相同,如果不相同,继续判断dep[top[x]]和dep[top[13]],以此类推。

可以看出树上的问题转到序列上就是处理区间[8,9],[1,4]的问题,使用线段树即可。

O 又如将x(例如4)的子树节点权值都+z,在序列上就是区间[2,6]的区域。我们可以在 dfs过程中记录子树大小size[x],那么就用线段树处理学序列上的区间[x,x+size[x]-1]了。

O 其余的树链剖分方法看博客:

https://www.cnblogs.com/ivanovcraft/p/9019090.html

 

树链剖分

标签:技术   info   好处   tps   问题   区域   使用   width   com   

原文地址:https://www.cnblogs.com/caterpillor/p/13064015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!