首页 > 其他分享 >Link Cut Tree模板(从别人那里拿的)

Link Cut Tree模板(从别人那里拿的)

时间:2024-02-09 15:44:18浏览次数:30  
标签:Cut lc int Tree splay Link pushup rc nroot

可以通过这道题

#include<bits/stdc++.h>
#define R register int
#define I inline void
#define G if(++ip==ie)if(fread(ip=buf,1,SZ,stdin))
#define lc c[x][0]
#define rc c[x][1]
using namespace std;
const int SZ=1<<19,N=3e5+9;
char buf[SZ],*ie=buf+SZ,*ip=ie-1;
inline int in(){
	G;while(*ip<'-')G;
	R x=*ip&15;G;
	while(*ip>'-'){x*=10;x+=*ip&15;G;}
	return x;
}
int f[N],c[N][2],v[N],s[N],st[N];
bool r[N];
inline bool nroot(R x){
	return c[f[x]][0]==x||c[f[x]][1]==x;
}
I pushup(R x){
	s[x]=s[lc]^s[rc]^v[x];
}
I pushr(R x){R t=lc;lc=rc;rc=t;r[x]^=1;}
I pushdown(R x)
{
	if(r[x]){
		if(lc)pushr(lc);
		if(rc)pushr(rc);
		r[x]=0;
	}
}
I rotate(R x){
	R y=f[x],z=f[y],k=c[y][1]==x,w=c[x][!k];
	if(nroot(y))c[z][c[z][1]==y]=x;c[x][!k]=y;c[y][k]=w;
	if(w)f[w]=y;f[y]=x;f[x]=z;
	pushup(y);
}
I splay(R x){
	R y=x,z=0;
	st[++z]=y;
	while(nroot(y))st[++z]=y=f[y];
	while(z)pushdown(st[z--]);
	while(nroot(x)){
		y=f[x];z=f[y];
		if(nroot(y))
			rotate((c[y][0]==x)^(c[z][0]==y)?x:y);
		rotate(x);
	}
	pushup(x);
}
I access(R x){
	for(R y=0;x;x=f[y=x])
		splay(x),rc=y,pushup(x);
}
I makeroot(R x){
	access(x);splay(x);
	pushr(x);
}
int findroot(R x){
	access(x);splay(x);
	while(lc)pushdown(x),x=lc;
	splay(x);
	return x;
}
I split(R x,R y){
	makeroot(x);
	access(y);splay(y);
}
I link(R x,R y){
	makeroot(x);
	if(findroot(y)!=x)f[x]=y;
}
I cut(R x,R y){
	makeroot(x);
	if(findroot(y)==x&&f[y]==x&&!c[y][0]){
		f[y]=c[x][1]=0;
		pushup(x);
	}
}
int main()
{
	R n=in(),m=in();
	for(R i=1;i<=n;++i)v[i]=in();
	while(m--){
		R type=in(),x=in(),y=in();
		switch(type){
		case 0:split(x,y);printf("%d\n",s[y]);break;
		case 1:link(x,y);break;
		case 2:cut(x,y);break;
		case 3:splay(x);v[x]=y;
		}
	}
	return 0;
}

标签:Cut,lc,int,Tree,splay,Link,pushup,rc,nroot
From: https://www.cnblogs.com/RTER/p/18012497

相关文章

  • P9663 Permutation on Tree 题解
    考虑枚举一个\(x\in[1,n)\),将\(\leqx\)的看作\(0\),\(>x\)的看作\(1\),那么一个排列的贡献实际上就是\(\sum_{x=1}^{n-1}\sum[[p_i\leqx]+[p_{i+1}>x]=1]\)。那么问题转变为一个给定一棵树,每一个点有权值\(0\)或\(1\),求所有排布方案的贡献之和。设\(f_x\)表示......
  • P10013 Tree Topological Order Counting 题解
    首先题目里面写了每一个数都有权值,一般这种题只能去想求出每一个的具体方案数,那么也就是我们得求出\(h_{i,j}\)表示在所有合法拓扑序中\(a_i=j\)的方案数。一颗树的拓扑序数量是\(\dfrac{n!}{\prodsiz_i}\),相信大家都知道。因为我们需要保证这一棵树满足拓扑排序的条件,不......
  • element-plus 2.4.1版本 el-tree踩坑
    element-plus2.4.1版本el-tree设置属性props中的label时,无法指定,例如<el-tree:data="datas.tree_data"show-checkboxnode-key="menu_id":props="{//label:function(data,node){//returndata.menu_name;//},......
  • PTES(Penetration Testing Execution Standard ,渗透测试执行标准)
    PTES是一种渗透测试标准,旨在提供一种通用语言描述的渗透测试执行范围和标准,始于2009年初,由一些创始成员围绕渗透测试行业讨论所得,参与者可以查看此列表。 其内容由7个主要部分组成,但该标准实际上并没有提供关于执行实际渗透测试的技术要求,但有一份相关的实践技术指南:http://ww......
  • [LeetCode] 2641. Cousins in Binary Tree II
    Giventherootofabinarytree,replacethevalueofeachnodeinthetreewiththesumofallitscousins'values.Twonodesofabinarytreearecousinsiftheyhavethesamedepthwithdifferentparents.Returntherootofthemodifiedtree.Note......
  • QPSK simulink实现
    调制部分总体框架各模块参数升余弦滚降滤波器滚降系数为1单双极性变换各阶段波形BufferDemuxRaisedCosineTransmitFilterQPSK信号功率谱密度解调部分经过AWGN信道后,假设已经进行了载波同步部分模块参数载波模块PulseGenerator由于经过了串并转换......
  • 执行 set-ExecutionPolicy RemoteSigned 失败解决方法
    1、Window+r,输入powershell 2、输入命令行set-ExecutionPolicyRemoteSigned3、再输入命令行Set-ExecutionPolicy-ScopeCurrentUser4、验证一下是否成功了:输入get-ExecutionPolicy,系统回复Restricted,表示状态是禁止的;若是提示了RemoteSigned就代表成功。5、如......
  • 【Flink入门修炼】1-3 Flink WordCount 入门实现
    本篇文章将带大家运行Flink最简单的程序WordCount。先实践后理论,对其基本输入输出、编程代码有初步了解,后续篇章再对Flink的各种概念和架构进行介绍。下面将从创建项目开始,介绍如何创建出一个Flink项目;然后从DataStream流处理和FlinkSQL执行两种方式来带大家学习Word......
  • Maven3.9.6 构建项目报错 Failed to execute goal org.apache.maven.plugins:maven-re
    在使用Maven3.9.6构建项目时,出现以下错误:[INFO][INFO]---resources:3.3.1:resources(default-resources)@service-sample---[INFO]Copying18resourcesfromsrc/main/javatotarget/classes[INFO]Copying15resourcesfromsrc/main/resourcestotarget/classes[IN......
  • Flink CDC实时同步PG数据库到Kafka
    一、安装规划操作系统服务器IP主机名硬件配置CentOS7.6192.168.80.131hadoop01内存:2GB,CPU:2核,硬盘:100GBCentOS7.6192.168.80.132hadoop02内存:2GB,CPU:2核,硬盘:100GBCentOS7.6192.168.80.133hadoop03内存:2GB,CPU:2核,硬盘:100GB......