[模板][P3690]Link Cut Tree
Description:
给定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。
模板,不解释,详见代码
#include<bits/stdc++.h>
using namespace std;
const int mxn=3e5+5;
int n,m,t[mxn],fa[mxn],st[mxn],rev[mxn],val[mxn],ch[mxn][2];
namespace lct {
int isnotrt(int x) {
return ch[fa[x]][0]==x||ch[fa[x]][1]==x;
};
void push_up(int x) {
t[x]=t[ch[x][0]]^t[ch[x][1]]^val[x];
};
void push_down(int x) {
if(rev[x]) {
rev[ch[x][0]]^=1,rev[ch[x][1]]^=1;
swap(ch[ch[x][0]][0],ch[ch[x][0]][1]);
swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);
rev[x]=0;
}
}
void rotate(int x) {
int y=fa[x],z=fa[y],tp=ch[y][1]==x;
if(isnotrt(y)) ch[z][ch[z][1]==y]=x; fa[x]=z; //切记要判根
ch[y][tp]=ch[x][tp^1],fa[ch[x][tp^1]]=y;
ch[x][tp^1]=y,fa[y]=x;
push_up(y),push_up(x);
};
void splay(int x) {
int tp=x,s=0; st[++s]=tp;
while(isnotrt(tp)) st[++s]=tp=fa[tp]; //先下放标记,再splay
while(s) push_down(st[s--]);
while(isnotrt(x)) {
int y=fa[x],z=fa[y];
if(isnotrt(y))
(ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);
rotate(x);
}
};
void access(int x) {
for(int y=0;x;x=fa[y=x])
splay(x),ch[x][1]=y,push_up(x); //要push_up
};
void makert(int x) {
access(x); splay(x);
swap(ch[x][0],ch[x][1]);
rev[x]^=1;
};
int findrt(int x) {
access(x); splay(x);
while(ch[x][0]) push_down(x),x=ch[x][0]; //要push_down
splay(x); return x;
};
void split(int x,int y) {
makert(x); access(y); splay(y);
};
void link(int x,int y) {
makert(x);
if(findrt(y)!=x) fa[x]=y; //这里需要根据题意写合并条件
};
void cut(int x,int y) {
makert(x);
if(findrt(y)==x&&fa[y]==x&&!ch[y][0]) { //findrt()之后x成为根,在此基础上分类讨论
fa[y]=ch[x][1]=0;
push_up(x);
}
};
}
using namespace lct;
int main()
{
scanf("%d%d",&n,&m); int opt,x,y;
for(int i=1;i<=n;++i) scanf("%d",val+i);
while(m--) {
scanf("%d%d%d",&opt,&x,&y);
if(opt==0) split(x,y),printf("%d\n",t[y]);
else if(opt==1) link(x,y);
else if(opt==2) cut(x,y);
else splay(x),val[x]=y;
}
return 0;
}
[模板][P3690]Link Cut Tree的更多相关文章
- P3690 【模板】Link Cut Tree (动态树)
P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> v ...
- (RE) luogu P3690 【模板】Link Cut Tree
二次联通门 : luogu P3690 [模板]Link Cut Tree 莫名RE第8个点....如果有dalao帮忙查错的话万分感激 #include <cstdio> #includ ...
- AC日记——【模板】Link Cut Tree 洛谷 P3690
[模板]Link Cut Tree 思路: LCT模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 30 ...
- LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板
P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...
- LG3690 【模板】Link Cut Tree (动态树)
题意 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的 ...
- LG3690 【模板】Link Cut Tree 和 SDOI2008 洞穴勘测
UPD:更新了写法. [模板]Link Cut Tree 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 后接两个整数(x,y),代表询问从x到y ...
- 【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)
题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
- 洛谷P3690 Link Cut Tree (模板)
Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...
- luogu P3690 【模板】Link Cut Tree (动态树)
嘟嘟嘟 LCT竟然看了整整一天,但好歹是看懂了. 教程这里不写,强烈推荐 闪狐大佬的博客 . 但是还是有几句想说的. 1.尽管LCT和splay很像,但是有一些细节还是不一样的.首先是rotate,我 ...
随机推荐
- Log4Net 无法写入到SqlServer
直接进入正题: 今天在测试使用Log4Net写入到数据库的时候,发现一直无法写入到数据库中,而且程式也没有报任何错误. 配置信息如下: <appender name="AdoNetAp ...
- unbuntu中如何像Windows一样顺畅的切换中英文输入法
1.首先在unbuntu安装搜狗拼音输入法(这个不用教了) 2.点击右上角的搜狗拼音的图标点击设置进入设置页面 3.选择高级 4.选择Fcitx设置 5.添加输入法英语(美国) 6.在设置中选择按键, ...
- S5PV210 看门狗定时和复位
第一节 S5PV210的看门狗定时器S5PV210上的看门狗定时器相当于一个普通的16bit的定时器,它与PWM定时器的区别是看门狗定时器可以产生reset信号而PWM定时器不能,S5PV210看门狗 ...
- Ex 6_14 布料剪裁问题_第八次作业
子问题定义: 定义p[i][j]为布料宽为i,高为j的最优产出,每次剪下一块布料,剩余布料最多形成三块矩阵面料.每次剪裁会有两种情况,水平切割布料,其次是将布料旋转90度后在切割布料. 递归关系: 初 ...
- CopyPropertis
commons-beanutils.jar PropertyUtils.copyProperties(Object dest, Object orig) spring-beans.jar BeanUt ...
- javascript 什么类型没有toString()?
JS里面任何对象都有toString()方法么?不是! null和undefined就没有!虽然null用typeof看的时候,是object类型的. 另外number对象调用toString()会报 ...
- Android studio下将项目代码上传至github包括更新,同步,创建依赖
AS中设置GIT 一.开篇 本文讲如何使用Android Studio将项目上传到github,虽然讲上传github的文章很多,但是大部分都是使用Git Bash命令行,虽然效率高些,但是有点麻烦, ...
- Range:HTML5中的新型Input类型
<div style="width:100%; height:100%; position:fixed; top:0; left:0; z-index:100000; backgrou ...
- Renderscript图像处理
作者:慧能 最近正在学习renderscript,后期会整理一篇完整的文档,先记着.... https://blog.csdn.net/codemydream/article/details/5346 ...
- java.lang.Math
四舍五人 System.out.println(Math.round(1.8f));//输出位2 static(静态)方法random() //: object/Shifting.java packa ...