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

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

链剖题目分类

我们能够把全部链剖的题目分为例如以下两类:

给定点权的链剖

这类链剖也是最基础的链剖,大部分题目都是这个样子的.
题目中会给定每个点的初始点权,以此来计算路径长度.
这样的题目相对来说比較简单,我们直接套模板两次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

posted @ 2016-01-24 16:57  mengfanrong  阅读(193)  评论(0编辑  收藏  举报