【树链剖分】链剖相关总结与心得

来源:互联网 发布:微星淘宝旗舰店 编辑:程序博客网 时间:2024/06/07 13:24

这两天连着做了一些链剖也看了不少链剖已经大致明白链剖里题目特点了

链剖题目分类

我们可以把所有链剖的题目分为如下两类:

给定点权的链剖

这类链剖也是最基础的链剖,大部分题目都是这个样子的.
题目中会给定每一个点的初始点权,以此来计算路径长度.
这种题目相对来说比较简单,我们直接套模板两次DFS然后建树,把每个点在线段树上对应节点的数值modify就好了.
标准模板题可以看:ZJOI2008树的统计Count
那就是一个裸的点权链剖

给定边权的链剖

这类链剖相比上面那个会稍微复杂一点.
题目中给定树的边权.
对于这种问题,做法很多,我的做法是在每条边的两个端点中,取深度较大的那一个,将其点权记录为边权.最后我们有了所有点的点权(其中1号点的点权为1)然后就可以转化成第一种问题来计算.
需要注意的是,由于我们采用这种方式所以需要对原本点权链剖的query函数略加改进,也就是我们在查询最大值时不能直接查询到最近公共祖先而是要查询到祖先下面的某个点.
模板题比如SPOJ QTREE

关于链剖的写法

我已经见过了两种链剖,他们的区别主要就在于父亲节点的记录方式即fa数组.
网上广为流传的一种链剖是fa函数只开一维,只记录其直接父节点(好像是这个样子我没仔细研究过毕竟不写那种)
另一种链剖是蒋一瑶神犇开创的,该种链剖父亲节点使用倍增方式记录,fa[MAXN][18]即这个样子.由于hzwer神犇也是写的这种链剖,我当时也是跟他学的这种链剖.

链剖与LCT的比较

网上普遍认为的是LCT绝大部分时候可以完全代替链剖.
二者的复杂度分别是O(Q log n)(LCT)和O(Q log2n)(链剖).后面的差别在于前者是借助Splay维护后者是借助线段树维护而且LCT可以实现添边删边等操作.
不过根据zky学长说的,LCT相比链剖常数比较大,因此复杂度的差别有时候并不是很明显.(想喷这句话的请注意”有的时候”)
而且显然LCT要比链剖难写多了(至少我是这么认为的)
尽管LCT大部分时候可以虐链剖,但是用链剖来骗骗分还是很好的选择嘛╮(╯▽╰)╭

不过链剖还是真特么难调啊…毕竟带高级数据结构的东西都很难调都很蛋疼QAQ
更主要的是我太沙茶了2333
大概就是这些了www
月下毛景树还真是蛋疼调啊调调不出来QAQ

2 0
原创粉丝点击