题目背景

动态树

题目描述

给定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和。

输入输出样例

输入样例#1:

3 3
1
2
3
1 1 2
0 1 2
0 1 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]的更多相关文章

  1. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  2. 洛谷.3690.[模板]Link Cut Tree(动态树)

    题目链接 LCT(良心总结) #include <cstdio> #include <cctype> #include <algorithm> #define gc ...

  3. LCT(link cut tree) 动态树

    模板参考:https://blog.csdn.net/saramanda/article/details/55253627 综合各位大大博客后整理的模板: #include<iostream&g ...

  4. Link Cut Tree 动态树 小结

    动态树有些类似 树链剖分+并查集 的思想,是用splay维护的 lct的根是动态的,"轻重链"也是动态的,所以并没有真正的轻重链 动态树的操作核心是把你要把 修改/询问/... 等 ...

  5. 洛谷P3690 Link Cut Tree (动态树)

    干脆整个LCT模板吧. 缺个链上修改和子树操作,链上修改的话join(u,v)然后把v splay到树根再打个标记就好. 至于子树操作...以后有空的话再学(咕咕咕警告) #include<bi ...

  6. 洛谷P3690 [模板] Link Cut Tree [LCT]

    题目传送门 Link Cut Tree 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代 ...

  7. 模板Link Cut Tree (动态树)

    题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联 ...

  8. [BZOJ2631]tree 动态树lct

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 5171  Solved: 1754[Submit][Status][Discus ...

  9. 【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)

    题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...

  10. Link Cut Tree 总结

    Link-Cut-Tree Tags:数据结构 ##更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1027479 一.概述 \(LCT\),动态树的一种,又可以 ...

随机推荐

  1. MySQL事务调优

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11429239.html 数据库事务 数据库事务是数据库系统执行过程中的一个逻辑处理单元,保证一个数据库 ...

  2. 【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 < ...

  3. 安装cuDNN

    cuDNN cuDNN是GPU加速计算深层神经网络的库(下载链接,前文已提供). 本人的下载文件是:cudnn-7.0-linux-x64-v4.0-prod.tgz 在终端中切换到文件所在文件夹,输 ...

  4. POJ 2808 校门外的树(线段树入门)

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...

  5. PostgreSQL角色和权限

      PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户.角色可以拥有数据库对象,如表.索引,也可以把这些对象上的权限赋予其它角色,以控制哪 ...

  6. upc组队赛4 Go Latin

    Go Latin 题目描述 There are English words that you want to translate them into pseudo-Latin. To change a ...

  7. 抓取猫眼TOP100的数据

    import requests import re import json from multiprocessing import Pool from multiprocessing import M ...

  8. [已解决]报错: Version in docker-compose is unsupported

    docker compose将解析版本为"2",而不是"3.3".应该改为: version: "2"

  9. springboot核心原理

    1.基于你对springboot的理解描述一下什么是springboot 它是一个服务于spring框架的框架,能够简化配置文件,快速构建web应用, 内置tomcat,无需打包部署,直接运行. 2. ...

  10. Spring Boot实现通用的接口参数校验

    Spring Boot实现通用的接口参数校验 Harries Blog™ 2018-05-10 2418 阅读 http ACE Spring App API https AOP apache IDE ...