【模板】Link Cut Tree

思路:

  LCT模板;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 300005
int n,m,val[maxn];
int top,ch[maxn][],f[maxn],xr[maxn],q[maxn],rev[maxn];
inline void in(int &now)
{
int if_z=;now=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
}
inline void updata(int now)
{
xr[now]=xr[ch[now][]]^xr[ch[now][]]^val[now];
}
inline void downdata(int now)
{
int l=ch[now][],r=ch[now][];
if(rev[now])
{
rev[l]^=,rev[r]^=,rev[now]^=;
swap(ch[now][],ch[now][]);
}
}
inline bool isroot(int now)
{
return ch[f[now]][]!=now&&ch[f[now]][]!=now;
}
inline void rotate(int now)
{
int fa=f[now],ffa=f[fa],l,r;
if(ch[fa][]==now) l=;else l=;r=l^;
if(!isroot(fa))
{
if(ch[ffa][]==fa) ch[ffa][]=now;
else ch[ffa][]=now;
}
f[now]=ffa,f[fa]=now,f[ch[now][r]]=fa;
ch[fa][l]=ch[now][r],ch[now][r]=fa;
updata(fa),updata(now);
}
inline void splay(int now)
{
top=,q[top]=now;
for(int i=now;!isroot(i);i=f[i]) q[++top]=f[i];
for(int i=top;i;i--) downdata(q[i]);
while(!isroot(now))
{
int fa=f[now],ffa=f[fa];
if(!isroot(fa))
{
if((ch[fa][]==now)^(ch[ffa][]==fa)) rotate(now);
else rotate(fa);
}
rotate(now);
}
}
void access(int now)
{
for(int t=;now;t=now,now=f[now])
{
splay(now);
ch[now][]=t;
updata(now);
}
}
void makeroot(int now)
{
access(now);
splay(now);
rev[now]^=;
}
int find(int now)
{
access(now);
splay(now);
while(ch[now][]) now=ch[now][];
return now;
}
void split(int x,int y)
{
makeroot(x);
access(y);
splay(y);
}
void cut(int x,int y)
{
split(x,y);
if(ch[y][]==x) ch[y][]=,f[x]=;
}
void link(int x,int y)
{
makeroot(x);
f[x]=y;
}
int main()
{
in(n),in(m);int op,x,y,xx,yy;
for(int i=;i<=n;i++) in(val[i]),xr[i]=val[i];
while(m--)
{
in(op);
if(op==)
{
in(x),in(y),split(x,y);
printf("%d\n",xr[y]);
}
if(op==)
{
in(x),in(y),xx=find(x),yy=find(y);
if(xx!=yy) link(x,y);
}
if(op==)
{
in(x),in(y),xx=find(x),yy=find(y);
if(xx==yy) cut(x,y);
}
if(op==)
{
in(x),in(y);
access(x);
splay(x);
val[x]=y;
updata(x);
}
}
}

AC日记——【模板】Link Cut Tree 洛谷 P3690的更多相关文章

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

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

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

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

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

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

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

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

  5. AC日记——校门外的树 洛谷 P1047

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

  6. AC日记——无线网络发射器选址 洛谷 P2038

    题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...

  7. AC日记——小A的糖果 洛谷七月月赛

    小A的糖果 思路: for循环贪心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #defi ...

  8. AC日记——矩阵取数游戏 洛谷 P1005

    矩阵取数游戏 思路: dp+高精: 代码: #include <bits/stdc++.h> using namespace std; #define ll long long struc ...

  9. AC日记——红色的幻想乡 洛谷 P3801

    红色的幻想乡 思路: 线段树+容斥原理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #de ...

随机推荐

  1. HDU3068:最长回文(Manacher模板)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. ACM.hdu1025

    to get the ans of how many roads at most that can be built between two line without intersection of ...

  3. Shell脚本循环读取文件中的每一行

    1.使用for循环 for line in `cat filename` do echo $line done 2.使用for循环 for line in $(cat filename) do ech ...

  4. executeQuery与executeUpdate

    executeQuery就是查   executeUpdate是更新,那就是增删改,和新建     吗?

  5. java有关Time类型数据的接收和转换

    一:前言 有关Time的时间其实很少有用到.但是用到就很纠结了,转换和保存,都是烦人的事情,我自己就在这上面吃过一个亏,所以就加载下来吧! 二:内容 (1):被坑的地方 实体类 import java ...

  6. 【51NOD-5】1293 球与切换器

    [算法]DP [题解]f[i][j][0]表示在i,j位置往下走的球数,f[i][j][1]表示在i,j位置往右走的球数,经过i,j的球若为-1则(num+1)/2往下,其余往右.+1类似. 转移见代 ...

  7. 【BZOJ】3971 [WF2013]Матрёшка

    [算法]区间DP [题解] 参考写法:BZOJ 3971 Матрёшка 解题报告 第二个DP可以预处理mex优化到O(nM+n2),不过我懒…… 第一个DP有另一种写法:不预处理,在一个n2取出来 ...

  8. HTML5获取地理位置信息并在Google Maps上显示

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  9. hdu 2059 龟兔赛跑(动态规划DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059 龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    M ...

  10. Centos 7 安装jdk1.7

    在linux中安装jdk是很平凡的事情了,刚学习linux给自己留下一笔记.刚安装centos其中可以会附带jdk,但是这并不影响,只要下载自己的jdk然后替换相对应的环境变量即可. 1.下载相对应的 ...