首页 > 其他分享 >【学习笔记】动态树 Link Cut Tree

【学习笔记】动态树 Link Cut Tree

时间:2023-04-15 17:02:51浏览次数:41  
标签:Cut return int Tree son splay fa Link inline

算法简介

动态树(Link Cut Tree)简称lct,可以维护动态的联通结构和动态链上信息维护问题,高妙数据结构。

算法流程

talk is cheap,show me the code.
洛谷模板题代码。

#include<bits/stdc++.h>
using namespace std;
inline int rd(){
	int f=1,j=0;
	char w=getchar();
	while(!isdigit(w)){
		if(w=='-')f=-1;
		w=getchar();
	}
	while(isdigit(w)){
		j=j*10+w-'0';
		w=getchar();
	}
	return f*j;
}
const int N=100010;
struct Link_Cut_Tree{
	int sum[N],ans[N],son[N][2],fa[N],p[N];
	bool tag[N];
	inline void pushdown(int u){
		if(!tag[u])return ;
		tag[son[u][0]]^=1,tag[son[u][1]]^=1;
		swap(son[u][0],son[u][1]),tag[u]=0;
		return ;
	}
	inline void update(int u){
		ans[u]=sum[u]^ans[son[u][0]]^ans[son[u][1]];
		return ;
	}
	inline bool isroot(int u){return !(son[fa[u]][0]==u||son[fa[u]][1]==u);}
	inline void rotate(int u){
		int x=fa[u],k=(son[x][1]==u);fa[u]=fa[x];
		if(fa[x]&&!isroot(x))son[fa[x]][son[fa[x]][1]==x]=u;
		son[x][k]=son[u][k^1],fa[son[u][k^1]]=x,update(x);
		son[u][k^1]=x,fa[x]=u,update(u);
		return ;
	}
	inline void splay(int u){
		update(u);
		int top=0;
		for(int i=u;;i=fa[i]){
			p[++top]=i;
			if(isroot(i))break;
		}
		for(int i=top;i>=1;i--)pushdown(p[i]);
		while(!isroot(u)){
			int x=fa[u];
			if(!isroot(x)){
				if((son[fa[x]][0]==x)^(son[x][0]==u))rotate(u);
				else rotate(x);
			}rotate(u);
		}
		return ;
	}
	inline void access(int u){
		int fir=u;
		for(int x=0;u;x=u,u=fa[u])splay(u),son[u][1]=x,update(u);
		splay(fir);
		return ;
	}
	inline void makeroot(int u){
		access(u),splay(u),tag[u]^=1;
		return ;
	}
	inline void split(int x,int y){
		makeroot(x),access(y),splay(y);
		return ;
	}
	inline int findroot(int u){
		access(u);
		while(son[u][0])u=son[u][0];
		splay(u);
		return u;
	}
	inline void cut(int x,int y){
		if((findroot(x)!=findroot(y)))return ;
		makeroot(x),access(y),splay(y);
		if(son[y][0]==x&&!son[x][1])fa[x]=son[y][0]=0,update(y);
		return ;
	}
}G;
int n,m;
signed main(){
	n=rd(),m=rd();
	for(int i=1;i<=n;i++)G.sum[i]=G.ans[i]=rd();
	for(int i=1;i<=m;i++){
		int k=rd(),x=rd(),y=rd();
		if(k==0)G.split(x,y),printf("%d\n",G.ans[y]);
		else if(k==1){
			G.makeroot(y);
			if(G.findroot(x)==y)continue;
			G.fa[y]=x;
		}
		else if(k==2)G.cut(x,y);
		else if(k==3)G.splay(x),G.sum[x]=y,G.update(x);
	}
	return 0;
}

lct的换根操作是通过splay的结构实现的,需要将u转到根后将整颗splay翻转。
同时由于lct的复杂度基于玄学的splay,如果splay少了可能会T,多转几下。(如findroot中的splay)

应用

挂个链接

标签:Cut,return,int,Tree,son,splay,fa,Link,inline
From: https://www.cnblogs.com/flywatre/p/17321406.html

相关文章

  • LCT-Link Cut Tree【模板】
    动态树与LCTLCT:LinkCutTree可以用来解决动态地连接和删除结合树链剖分(实链剖分)和Splay树“原树实链从上到下,对应Splay树从左到右”把原树转化到辅助树上操作而辅助树由若干个Splay树用虚边相连得来P3690【模板】动态树(LinkCutTree)题目描述#include<bits/stdc++.h>......
  • 【题解】Tree MST
    题面给定一棵\(n\)个节点的树,现有有一张完全图,两点\(x,y\)之间的边长为\(w_x+w_y+dis_{x,y}\),其中\(dis\)表示树上两点的距离。求完全图的最小生成树。\(n\leq2\times10^5\)。题解???神秘借鉴支配对的思想,点分治后将树中点权替换为\(dep_i+w_i\),选择点权最小的一个......
  • macOS Finder move & cut & copy & paste file All In One
    macOSFindermove&cut&copy&pastefileAllInOne鼠标拖动Drag&Drop快捷键shortcutsmacOSfindercut&copyfile快捷键CommandXmacOSfindercopyfile快捷键CommandCmacOSfindercopy&pastefile......
  • m基于Simulink的自适应模糊控制器设计与仿真实现
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要模糊自适应控制器同时结合自适应控制和模糊控制,形成具有自适应的功能的控制系统。模糊自适应控制不要求控制对象具有精确的数学模型,并且还巧妙的引入了自适应律以方便实时的去学习被控对象所具有的各种动态特性,然......
  • m基于Simulink的自适应模糊控制器设计与仿真实现
    1.算法仿真效果matlab2022a仿真结果如下:                2.算法涉及理论知识概要        模糊自适应控制器同时结合自适应控制和模糊控制,形成具有自适应的功能的控制系统。模糊自适应控制不要求控制对象具有精确的数学模型,并且还巧妙......
  • 两个循环搞定多级菜单列表递归成tree
    菜单类publicstaticclassMenu{Menu(Stringdata){String[]split=data.split("");this.id=Integer.valueOf(split[0]);this.name=split[1];this.pid=Integer.valueOf(split[2]);......
  • Service Mesh框架选型对比分析:Linkerd、Envoy、Istio、Conduit
    当前,业界主要有以下主要几种ServiceMesh框架,下面进行详细的说明及对比。1、LinkerdLinkerd是Buoyant公司2016年率先开源的高性能网络代理,是业界的第一款ServiceMesh框架。其主要用于解决分布式环境中服务之间通信面临的一些问题,如网络不可靠、不安全、延迟丢包等问题。Linkerd使......
  • 如何做一名优秀的团队领导?LinkedIn CEO给出的3条建议
    1.Focus 专注。是的,你原来肯定听过这一点,“专注”几乎都快成硅谷人的口头禅了。创办一家公司需要创业者全身心的投入,所以专注对于创业者显得格外重要。但不同于以往的解读,Jeff也提出了自己对于“专注”一些独到的看法。 Jeff在雅虎任职期间,雅虎开拓了大量的业务,包括搜索、新闻......
  • m基于MATLAB和simulink实现模糊控制器以及模糊神经网络控制器
    1.算法仿真效果matlab2017b仿真结果如下:2.算法涉及理论知识概要模糊神经网络控制在控制领域里目前已经成为一个研究热点,其原因在于两者之间的互补性质。神经网络和模糊系统均属于无模型的估计器和非线性动力学系统,也是一种处理不确定性、非线性和其它不确定问题(ill-posedprob......
  • 基于simulink的chaios混沌电路仿真
    1.算法仿真效果matlab2017B仿真结果如下:       根据混沌运动中混沌吸引子的特征,混沌吸引子是整体稳定和局部不稳定相结合的产物,在相空间的表现是“伸长”和“折叠”。它具有复杂的拉伸,折叠和伸缩结构,使得按指数规律发散的系统保持在有限的空间内,即一切位于......