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\),动态树的一种,又可以 ...
随机推荐
- 【leetcode】948. Bag of Tokens
题目如下: You have an initial power P, an initial score of 0 points, and a bag of tokens. Each token can ...
- sql的分页
public static string GetPageSql(string sql, int start, int end) { return string.Fo ...
- Android中通过反射获取资源Id(特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取)
在将自己写的工具打成.jar包的时候,有时候会需要引用到res中的资源,这时候不能将资源一起打包,只能通过反射机制动态的获取资源. /** * 反射得到组件的id号 */ public static ...
- BN和正则化一起使用的后果
就是因为 batch norm 过后, weight 影响没那么重了,所以 l2 weight decay 的效果就不明显了. 证明了L2正则化与归一化相结合时没有正则化效应.相反,正则化会影响权重的 ...
- Mysql安装和简单设置
MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...
- python 100day notes (1)
x1 + x2 +x3 + x4 = 8 多少正整数解 上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案 即用三个隔板插7个空位. 答案C(7,3) =35 # __name__是Pyt ...
- 大数据学习笔记之Linux基础(一):Linux初窥
文章目录 一.Linux入门概述 1.1 概述 1.2 下载地址 1.3 Linux特点 1.4 Linux和Windows区别 二.VM安装相关 2.1 安装VMWare虚拟机 2.2 安装Cent ...
- .NET Core开源组件:后台任务利器之Hangfire 转载 https://www.cnblogs.com/chenug/p/6655636.html
.NET Core开源组件:后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的D ...
- winserver 2008 找不到回收站的解决办法
桌面新建文件夹,命名为 “回收站.{645ff040-5081-101b-9f08-00aa002f954e}”,就可以了.
- 暴力穷举zip、rar压缩文件的密码
生成密码的方式类似与时钟,末尾遍历完了第k位所有的字符,就让第k位的前一位到下一位字符,第k位回到第0个字符. 对python还不太熟悉,效率比较低,但是能破解简单的密码. import zipfil ...