luoguP3690 【模板】Link Cut Tree (动态树)[LCT]
题目背景
动态树
题目描述
给定N个点以及每个点的权值,要你处理接下来的M个操作。操作有4种。操作从0到3编号。点从1到N编号。
0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通的。
1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接。
2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在。
3:后接两个整数(x,y),代表将点X上的权值变成Y。
输入输出格式
输入格式:
第1行两个整数,分别为N和M,代表点数和操作数。
第2行到第N+1行,每行一个整数,整数在[1,10^9]内,代表每个点的权值。
第N+2行到第N+M+1行,每行三个整数,分别代表操作类型和操作所需的量。
输出格式:
对于每一个0号操作,你须输出X到Y的路径上点权的Xor和。
输入输出样例
3 3
1
2
3
1 1 2
0 1 2
0 1 1
3
1
说明
数据范围:
因为只是模板题吧。。在这里直接放上代码。。
关于LCT可以看论文:QTREE解法的一些研究
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; int read(){
char ch;
int re=;
bool flag=;
while((ch=getchar())!='-'&&(ch<''||ch>''));
ch=='-'?flag=:re=ch-'';
while((ch=getchar())>=''&&ch<='') re=re*+ch-'';
return flag?-re:re;
} struct Splay{
int ch[],xr,fa;
bool rev;
}; const int maxn=; int n,m,top;
int val[maxn],stk[maxn];
Splay T[maxn]; inline void push_up(int x){ T[x].xr=T[T[x].ch[]].xr^T[T[x].ch[]].xr^val[x]; } inline bool isroot(int x){
return T[T[x].fa].ch[]!=x&&T[T[x].fa].ch[]!=x;
} inline void push_down(int x){
if(T[x].rev){
T[T[x].ch[]].rev^=;
T[T[x].ch[]].rev^=;
swap(T[x].ch[],T[x].ch[]);
T[x].rev=;
}
} void rot(int x){
int y=T[x].fa,z=T[y].fa,l,r;
if(T[y].ch[]==x) l=;
else l=;
r=l^;
T[x].fa=z;
if(!isroot(y)) T[z].ch[T[z].ch[]==y]=x;
T[T[x].ch[r]].fa=y;
T[y].ch[l]=T[x].ch[r];
T[y].fa=x;
T[x].ch[r]=y;
push_up(y),push_up(x);
} void splay(int x){
top=; stk[top]=x;
for(int i=x;!isroot(i);i=T[i].fa) stk[++top]=T[i].fa;
for(int i=top;i;i--) push_down(stk[i]);
while(!isroot(x)){
int y=T[x].fa,z=T[y].fa;
if(!isroot(y)){
if((T[y].ch[]==x)^(T[z].ch[]==y)) rot(x);
else rot(y);
}
rot(x);
}
} void acc(int x){
int t=;
while(x){
splay(x);
T[x].ch[]=t;
push_up(x);
t=x; x=T[x].fa;
}
} void make_root(int x){
acc(x);
splay(x);
T[x].rev^=;
} int find(int x){
acc(x);
splay(x);
while(T[x].ch[]) x=T[x].ch[];
return x;
} void split(int x,int y){
make_root(x);
acc(y);
splay(y);
} void cut(int x,int y){
split(x,y);
if(T[y].ch[]==x) T[y].ch[]=,T[x].fa=;
} void link(int x,int y){
make_root(x);
T[x].fa=y;
} int main(){
// freopen("temp.in","r",stdin);
n=read(),m=read();
for(int i=;i<=n;i++){
val[i]=read();
T[i].xr=val[i];
}
int opt,x,y,xx,yy;
while(m--){
opt=read(),x=read(),y=read();
switch(opt){
case :{
split(x,y);
printf("%d\n",T[y].xr);
break;
}
case :{
xx=find(x),yy=find(y);
if(xx!=yy) link(x,y);
break;
}
case :{
xx=find(x),yy=find(y);
if(xx==yy) cut(x,y);
break;
}
case :{
acc(x);
splay(x);
val[x]=y;
push_up(x);
break;
}
}
}
return ;
}
luoguP3690 【模板】Link Cut Tree (动态树)[LCT]的更多相关文章
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷.3690.[模板]Link Cut Tree(动态树)
题目链接 LCT(良心总结) #include <cstdio> #include <cctype> #include <algorithm> #define gc ...
- LCT(link cut tree) 动态树
模板参考:https://blog.csdn.net/saramanda/article/details/55253627 综合各位大大博客后整理的模板: #include<iostream&g ...
- Link Cut Tree 动态树 小结
动态树有些类似 树链剖分+并查集 的思想,是用splay维护的 lct的根是动态的,"轻重链"也是动态的,所以并没有真正的轻重链 动态树的操作核心是把你要把 修改/询问/... 等 ...
- 洛谷P3690 Link Cut Tree (动态树)
干脆整个LCT模板吧. 缺个链上修改和子树操作,链上修改的话join(u,v)然后把v splay到树根再打个标记就好. 至于子树操作...以后有空的话再学(咕咕咕警告) #include<bi ...
- 洛谷P3690 [模板] Link Cut Tree [LCT]
题目传送门 Link Cut Tree 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代 ...
- 模板Link Cut Tree (动态树)
题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联 ...
- [BZOJ2631]tree 动态树lct
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 5171 Solved: 1754[Submit][Status][Discus ...
- 【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)
题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
- Link Cut Tree 总结
Link-Cut-Tree Tags:数据结构 ##更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1027479 一.概述 \(LCT\),动态树的一种,又可以 ...
随机推荐
- MySQL事务调优
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11429239.html 数据库事务 数据库事务是数据库系统执行过程中的一个逻辑处理单元,保证一个数据库 ...
- 【leetcode】982. Triples with Bitwise AND Equal To Zero
题目如下: Given an array of integers A, find the number of triples of indices (i, j, k) such that: 0 < ...
- 安装cuDNN
cuDNN cuDNN是GPU加速计算深层神经网络的库(下载链接,前文已提供). 本人的下载文件是:cudnn-7.0-linux-x64-v4.0-prod.tgz 在终端中切换到文件所在文件夹,输 ...
- POJ 2808 校门外的树(线段树入门)
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...
- PostgreSQL角色和权限
PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户.角色可以拥有数据库对象,如表.索引,也可以把这些对象上的权限赋予其它角色,以控制哪 ...
- upc组队赛4 Go Latin
Go Latin 题目描述 There are English words that you want to translate them into pseudo-Latin. To change a ...
- 抓取猫眼TOP100的数据
import requests import re import json from multiprocessing import Pool from multiprocessing import M ...
- [已解决]报错: Version in docker-compose is unsupported
docker compose将解析版本为"2",而不是"3.3".应该改为: version: "2"
- springboot核心原理
1.基于你对springboot的理解描述一下什么是springboot 它是一个服务于spring框架的框架,能够简化配置文件,快速构建web应用, 内置tomcat,无需打包部署,直接运行. 2. ...
- Spring Boot实现通用的接口参数校验
Spring Boot实现通用的接口参数校验 Harries Blog™ 2018-05-10 2418 阅读 http ACE Spring App API https AOP apache IDE ...