lct各类操作小记录
学习了一下lct,觉得access和splay都是小问题,背背板子都可以解决,那么就按照这两个基本操作,有很多不同的转换,很多实际运用。
access:使它到根节点上的边都为重边,且与它的重儿子切断
No.1 move_to_root(x),将x设为原树的根,将x到根上的点形成一棵splay,但是此时x只是辅助树的根,所以要将它变为原树的根,只需将它们的深度全部反调,然后就可以了。
void move_to_root(int x) { access(x); splay(x); reverse(x); }
No.2 find_root(x),找到x在辅助树中的根,这个比较好理解,直接向上找就行了
No.3 link(x,y) (无向图)
void link(int x,int y) { move_to_root(x); fa[x]=y; }
No.4 cut(x,y) 将x变到主树的根中,然后将y access+splay
void cut(int x,int y) { move_to_root(x); access(y); splay(y); fa[x]=0; c[y][0]=0; }
No.5 链上修改,及要使一条链上的节点恰好在一个splay中
void split(int x,int y) { move_to_root(y); access(x); splay(x); }
x->y上所有路径都在以x为子树的树中,只需要对y打个标记即可