LCT学习笔记

一.每棵splay中的中序遍历都是原树上深度严格递增的点

二.原树上x与y有边,在LCT上有两种可能,所以fa[x]也有两种不同的含义

1.在同一颗splay中,那么之间就没有边的关系了,换句话说不一定相邻,但可以根据性质一来找出
此时的fa[x]指的是splay中的fa

2.在不同的splay中,那么x所在的splay的根节点会有一条连向y的边,
具体形式为fa[rt_x]=y(认父不认子),可以发现此时x一定是当前splay中深度最小的点(因为它有父亲)
所以如果一颗splay的根节点有指出去的边fa[rt],那么这条边的主人一定是这颗splay中深度最小的点
此时的fa[x]指的是两颗splay间的边
void link(int x,int y)
{
	access(x);
	splay(x);
	fa[x]=y;
}

四.Cut

access(x)后可以发现,x是新splay中深度最大的点,x的父亲y是深度次大的点,我们只需将x和其余点断开即可,并不需要将y splay成x的左儿子
void cut(int x,int y)
{
	access(x);
	splay(x);
	fa[ch[x][0]]=0;
	ch[x][0]=0;
}

五.Findroot

int findroot(int x)
{
	access(x);
	splay(x);
	while(ch[x][0])
	{
		pushdown(x);
		x=ch[x][0];
	}
	splay(x);
	return x;
}

以上为有根树的做法,不用查询x到y的路径信息,只需要查询x到根节点的路径信息,就可以这样做。

但如果要查询x到y的路径信息,那么就需要makeroot,将y变成树的根,然后就可以用查询x到根节点的路径信息的做法了

六.Makeroot

access(x)后x是新splay中深度最大的点,我们直接交换x的左右儿子,就能完成将x变成splay中深度最小的点
void makeroot(int x)
{
	access(x);
	splay(x);
	pushR(x);
}

七.新Link和Cut

void link(int x,int y)
{
	makeroot(x);
	if(findroot(y)!=x)fa[x]=y;
}
void cut(int x,int y)
{
	makeroot(x);
	if(findroot(y)==x&&fa[y]==x&&ch[y][0]==0)
	{
		fa[y]=ch[x][1]=0;
		pushup(x);
	}
}
全部评论

相关推荐

02-01 12:05
复旦大学 Java
腾讯的提前批大概率应该是没有笔试的,但是这个时候有相当部分的同学简历估计都没有准备好,没准备好的同学也不用急,大部分都是3月之后开,这个时候开的绝大多数都是神仙打架,问的东西也比较难,打算投递的同学也多看下计算机网络和操作系统,腾讯对这部分的知识问的比较多。另外多刷下牛客的热门题库,刷题注意刷ACM模式,和牛客的周赛题,腾讯有的部门会从这里面出原题。我是@程序员花海关注我,带你了解更多校招资讯!
程序员花海:还没有来得及准备的同学可以看下学习路线:https://www.nowcoder.com/discuss/824693499982315520?sourceSSR=users算法题:https://www.nowcoder.com/feed/main/detail/20e7a999fa04485b88340a274411ca0d?sourceSSR=users八股文:https://www.nowcoder.com/discuss/833102362771251200?sourceSSR=users简历书写方式:https://www.nowcoder.com/discuss/839907820706205696?sourceSSR=users都是以前在牛客发的文章~
软开人,秋招你打算投哪些...
点赞 评论 收藏
分享
2025-12-16 22:45
已编辑
电子科技大学 活动运营
Rain_Codin...:简历感觉有点乱了而且一股AI味,AI简历的一个特点就是废话很多,一个点能分成四个点来讲,可以仔细优化一下。 btw,手机看简历不好看出来,可以把电脑上的简历截图放出来。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务