首页 > 代码库 > splay/LCT总结
splay/LCT总结
splay:
单纯splay的话,如果不要求第k大,或者求rank,基本都可以用set代替了。。
几个套路:
1.为了简化代码,也避免RE,大部分 题目都可以在建树时,先建一个空的起点和空的终点,然后在ch[ch[rt][1]][0]这个key_pos位置根据原序列建树。这样做的话在find_kth时候要特别注意k要++
2.其实不管是区间修改还是点修改,都可以把要修改的部分转到key_pos,然后直接打标记就好了。这里的标记和线段树的标记还是有那么一丢丢 不一样的。。这里的标记是打在一个点上,线段树是把 整个区间都标记了。可能需要画图自己理解
3.序列很长的时候,往往需要离散化。要考虑哪些点是在操作过程中会单独拿出来。比如删除某个点,就必须把这个点单独拿出来。其它的操作即使是询问,不单独拿出来也是不要紧的其实
4.大部分操作完毕(比如插入)记得把对象结点旋转到根。这也算是复杂度的保证(玄学)
LCT:
其实用来维护森林的连通性的数据结构
1.结点0的初始化很重要,要考虑清楚
2.初始化的时候可以把所有边都设置成轻边。之后的操作会将需要的边变成重边,所以也不太需要担心复杂度的问题(这种东西的复杂度不都是口口相传,还都是玄学)
3.路径操作都是先make_rt一个点,然后再access另一个点,那整条路径就用一整棵splay维护起来了,打个标记或者直接从根那需要的信息就完事啦
4.对于一个基环森林,可以先拆掉一条边(u,v)。则可以把v作为这棵树的根,u记为v的special father。操作的时候要多考虑spf的影响
splay/LCT总结