LCT学习笔记

开始胡言乱语了。。。只是记录一下自己的想法,退役了再来补坑

关于复杂度?
根据splay的复杂度,可以保证复杂度吗?

1.关于LCT的结构?
分为虚边和实边,实边代表splay,即深度中序遍历单调增的一条链。
虚边,从splay中任意一个点连出,连向该splay中深度最小点在原树上的父亲。
这个结构可以得出一个很基本的结论,沿着虚边走深度肯定是递减的。这也保证了access操作的可行性。
还有就是每个点的儿子至多只有一条实边相连。
2.为什么要分实边和虚边?
可以类比树剖的轻重儿子,都是为了减少时间复杂度。怎么减少了?因为我们通过优先遍历重儿子使得重链上的dfs序连续,从而通过线段树维护的是重链上的信息,因而我们可以保证每一条路径中间包含的不连续的链的总数一定是log级别的,因为我们往路径向下走时,若走重儿子,则无影响,否则至少可以忽略掉子树中一半以上的点。
实边和虚边的划分首先是为了将树化为链方便操作,二来是因为实边虚边划分的任意性方便后续的修改。
那么LCT呢?

1.关于Pushup,为什么左子树加右子树加本身就可以作为一条链的总的信息?因为最初splay都是一条链,access操作后的splay按照中序遍历还是一条链,这里只是选一个点方便记录链的信息。
2.access操作的解释?为什么要这么做?
每次当前splay的根节点的那条虚边要变为实边,才能保证深度一路降低直至根节点。那么原来虚边的父亲该怎么变?
它要为现在深度较大的子树让路,所以原来的右儿子要分开,虚边怎么连?根据中序遍历跟虚边的定义,直接把实边变为虚边(这也许也是LCT上虚边定义这么奇怪的原因吧。。。)
定义第一次操作的时候强制把该点的右儿子变为虚边,也就是access完之后该点变为路径上深度最大的点。
这个ACCESS操作可以类比线段树的合并操作,是关键。拉出来链之后才能进行计算的操作。
access代码:

inline void access(int x){
	for(int y=0;x;y=x,x=f[x])
		splay(x),c[x][1]=y,pushup(x);
}

为什么f[x]总能指向原来的虚边而不是splay内部的边?
首先初始情况肯定是虚边,且是splay根节点的父亲,每次splay后,该splay外部的连边不变,根节点仍然能连到该父亲,且f数组在splay过程中能动态改变。

提示:操作后不要忘记splay到根节点!
注意原树的树根是LCT树根的最左儿子。

3.关于makeroot操作。
关于下传翻转标记的问题,个人认为可以pushr操作时变为儿子节点的r异或一,然后交换儿子,而不是该节点的r异或一。

4.关于findroot操作。
事实上,暴力找左儿子的方法即使是在splay这个Log高度的树上,也显得比较慢,如果没有cut操作可以用并查集实现判断link的合法性。

5.关于翻转的严谨性问题?

例题学习:
P2486
这是一条维护链(splay)信息的题目。
由于splay维护的是一条链,对于pushup的合并操作,我们可以把它看成是这条链的上半部分的信息和该节点和这条链的下半部分的信息的合并,因此对于这道题,如果只是在区间里会很容易就解决,但是在树上就需要找这条链上半部分最下面的那个点和下半部分最上面的那个点,也就是splay上根节点的前驱和后继,这个可以记录。
所以理论上来说,解决了Pushup的问题,其他问题就套板子即可,但是还是要深入理解一下。
本质还是access的问题。
对于断边连边操作(虚变实),相当于对根节点重新pushup一波,所以不会有任何问题。

P3703
利用LCT的splay来维护同色连通块,并与树剖结合的好题,第一次做。
一棵splay就对应了一个同色连通块,这个很好想,也是lct作为辅助树的一个显著的特点。
首先用d数组维护到根要走的虚边数(也就是颜色数)。
每次修改就是access这个点,每次连实边,断虚边的时候在原树上利用树剖修改子树的d值。
同时维护区间max。
二操作利用树上差分,为加和减lca。

P2387
利用LCT来维护最小生成树。
按照A从小到大排序,然后一条一条地添边,每次添边的时候若遇到环,则删除环中的最大的边,可以证明出,这样删除不会影响最终答案的正确性(如果路径的权值定义为路径长度和,怎么求?)
至于每次对1-n路径的查询,LCT维护路径权值即可(基操)。

P4172
操作倒着来,同上。

P4219
这道题比较简单,利用LCT维护连通块的大小。
LCT的splay中维护连通块的大小,加边直接加,查询则删边,splay两个点,然后是两个连通块大小的乘积。

P2542
利用LCT维护双连通分量,pushup中维护的是splay中桥的数目,需要利用树剖进行路径修改,子树和查询。双连通分量的桥即为子树差分数组和为0的点与点的父亲的那一条边。

等等,LCT与树剖真的能结合吗?树剖不是静态的吗?

P4180
严格次小生成树是在原树的基础上添加某一条不在生成树上的边,并在对应的路径上删去最大权值的边(次大权值的边)。
于是就要维护原树路径的最大和次大值,Pushup稍微改改就行了。

P4234
类似魔法森林,每次加边的时候判断是否有环,有环则断开环中的最小边,即可保证最优。

P2173
开多棵lct就行了?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值