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\),动态树的一种,又可以 ...
随机推荐
- 使用springBoot完成阿里云短信验证
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- shell读取文件第一行和最后一行,小数的运算比较
1. 读取文件的第一行:head -n +1 file.txt 读取文件的最后一行: tail -n -1 file.txt echo 12:30:55 | cut -d: -f 1 结果为12,意思 ...
- [MySQL] 怎样使用Mysqlcheck来检查和修复, 优化表
mysqlcheck 是 MySQL 自带的一个工具,作用就是保养 表,其实就是检查,分析,修复和优化了.下面来介绍 mysqlcheck 工具的简单使用,官方文档在这里 原文网址:http://bl ...
- 在pycharm中切换python版本的方法
转载自:https://blog.csdn.net/sgfmby1994/article/details/77876873 目前,python2和python3都有很重要的意义,所以,我们经常会在电脑 ...
- Oracle中使用REGEXP_SUBSTR,regexp_replace,wm_concat函数
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...
- 个人笔记 - MATLAB
1.教程 2.基本知识 2.1 帮助文档设置成中文:链接1 2.2 多行注释: 链接1 2.3 MATLAB基本数据类型: 链接1 链接2 2.4 matlab中的 ndims(a).length( ...
- python requests函数封装方法
python requests函数封装方法 上代码 import requests import json """ 封装request请求, 1.post:my_pos ...
- rsync+inotify实现实时同步案例
转自:http://chocolee.blog.51cto.com/8158455/1400596 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐 ...
- Java继承和构造函数
构造函数不是类的成员,它们不是由子类继承的.它们用于初始化实例变量. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class CSuper { public ...
- 关于JS递归函数求斐波那契数列两种实现方法
百度已经解释的很详细了,但是不写注释还真是看不懂,递归,就直接套公式了,for循坏,我们就用EXCEL看一下规律 可以看到B是A+B的和,A往后就是B的值,所以我们需要第三个变量来保存他们的和,取出B ...