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\),动态树的一种,又可以 ...
随机推荐
- UNP学习 非阻塞I/O
缺省状态下,套接口时阻塞方式的.这意味着当一个套接口调用不能立即完成时,进程进入睡眠状态,等待操作完成.我们将可能阻塞的套接口调用分成四种. 1.输入操作:read.readv.recv.recvfr ...
- 大碗宽面Beta迭代阶段博客目录
大碗宽面Beta迭代阶段博客目录 Githhub:https://github.com/rz-2000/Course-Evaluation 一.Scrum Meeting 1. [第十周会议记录]ht ...
- windows 下redis在后台运行
打开命令终端,cd进入redis目录 安装redis服务:redis-server --service-install redis.windows.conf --loglevel verbose re ...
- Openstack组建部署 — Environment of Controller Node
目录 目录 前文列表 Controller Node Install and configure components Setup DNS Server Setup NTP Server Instal ...
- 数据访问层的基类BaseDALSQL
using System; using System.Text; using System.Collections; using System.Data; using System.Data.Comm ...
- MyBatis原理,Spring、SpringBoot整合MyBatis
1. MyBatis概述 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...
- [bzoj4589]Hard Nim(FWT快速沃尔什变化+快速幂)
题面:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 题意 求选恰好n个数,满足每个数都是不大于m的质数,且它们的异或和为0的方案数. 解法 ...
- Linux 常用指令总结
一. 与时间有关的参数: 1.find 基本语法参数如下: find [PATH] [option] [action] -mtime n : n为数字,意思为在n天之前的“一天内”被更改过的文件: - ...
- UVA11054_Wine trading in Gergovia
大致题意: 直线上有n个村庄,要么买酒要么卖酒,运酒到隔壁村庄需要这个酒的权值个劳动力 问你至少需要多少劳动力 题目保证了所有权值和为0!!!!!!!!!!!!这个意义重大,表示这是一个封闭的群体 这 ...
- Fedora LVM磁盘大小调整
umount /dev/fedora/swap e2fsck -f /dev/fedora/swap