一位大佬写的代码。(加上我自己的一些习惯性写法)

存个模板。

  1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1e5+5;
4 int n,m,a[N],w[N];
5 struct node{
6 int fa,lc,rc,rv;
7 #define lc(x) t[x].lc
8 #define rc(x) t[x].rc
9 #define fa(x) t[x].fa
10 #define rv(x) t[x].rv
11 }t[N];
12
13 void up(int x){
14 w[x]=a[x]^w[lc(x)]^w[rc(x)];
15 }
16
17 bool isr(int x)//isroot
18 {
19 return lc(fa(x))!=x&&rc(fa(x))!=x;
20 }
21 bool wrt(int x){
22 return rc(fa(x))==x;
23 }
24
25 void rev(int x){//做标记
26 if(!x) return;
27 swap(lc(x),rc(x));
28 rv(x)^=1;
29 }
30
31 void down(int x){//下传标记
32 if(rv(x)){
33 rev(lc(x)),rev(rc(x));
34 }
35 rv(x)=0;
36 }
37
38 void rot(int x){//旋转
39 int y=fa(x),z=fa(y),b=(lc(y)==x)?rc(x):lc(x);
40 if(z&&!isr(y)) (lc(z)==y?lc(z):rc(z))=x;
41 fa(x)=z,fa(y)=x;
42 if(b) fa(b)=y;
43 if(lc(y)==x) rc(x)=y,lc(y)=b;
44 else lc(x)=y,rc(y)=b;
45 up(y),up(x);
46 }
47
48 void path(int x){//根到节点上的点都下传标记
49 if(!isr(x)) path(fa(x));
50 down(x);
51 }
52
53 void spl(int x){//splay
54 path(x);
55 while(!isr(x)){
56 if(!isr(fa(x))) wrt(x)==wrt(fa(x))?rot(fa(x)):rot(x);
57 rot(x);
58 }
59 }
60
61 void acs(int x){
62 for(int y=0;x;y=x,x=fa(x)){
63 spl(x),rc(x)=y,up(x);
64 }
65 }
66
67 void mrt(int x){//makeroot
68 acs(x),spl(x),rev(x);
69 }
70
71 int fnd(int x){//findroot
72 acs(x),spl(x),down(x);
73 while(lc(x)) x=lc(x),down(x);
74 spl(x);return x;
75 }
76
77 void lk(int x,int y){//link
78 mrt(x);
79 if(fnd(y)==x) return ;
80 fa(x)=y;
81 }
82
83 void cut(int x,int y){//删边
84 mrt(x),acs(y),spl(y);
85 if(lc(y)!=x) return ;
86 lc(y)=fa(x)=0;
87 }
88
89 int main(){
90 scanf("%d%d",&n,&m);
91 for(int i=1;i<=n;i++){
92 scanf("%d",&a[i]),w[i]=a[i];
93 }
94 for(int i=1;i<=m;i++){
95 int o,x,y;
96 scanf("%d%d%d",&o,&x,&y);
97 if(o==0){
98 mrt(x),acs(y),spl(y);//提取x到y的路径
99 cout<<w[y]<<endl;
100 }
101 if(o==1) lk(x,y);
102 if(o==2) cut(x,y);
103 if(o==3) acs(x),spl(x),a[x]=y,up(x);
104 }
105 return 0;
106 }

洛谷P3690 (动态树模板)的更多相关文章

  1. 洛谷P3372线段树模板1——线段树

    题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...

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

    题目链接 \(RT\). FlashHu巨佬的博客 #include <cstdio> #define R register int #define I inline void #defi ...

  3. 洛谷P3373线段树模板2

    题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...

  4. 洛谷3372线段树模板题 对区间+k或者查询区间和

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

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

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

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

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

  7. 【洛谷P3369】【模板】普通平衡树题解

    [洛谷P3369][模板]普通平衡树题解 题目链接 题意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3 ...

  8. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  9. 洛谷P3018 [USACO11MAR]树装饰Tree Decoration

    洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...

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

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

随机推荐

  1. element多重校验报please transfer a valid prop path to form item

  2. 第十一天python3 递归函数

    递归Recursion 函数直接或者间接调用自身就是递归: 递归需要有边界条件,递归前进段.递归返回段: 递归一定要有边界条件: 当边界条件不满足的时候,递归前进: 当边界条件满足的时候,递归返回: ...

  3. linux docker .net core 从建立网站到预览

    docker的安装在网上一搜一大把,windows安装的就是exe双击,linux安装需要执行语句 ps:需要准备xftp.xshell.vs 2019.linux服务器.docker账号密码 例如: ...

  4. python shutil相关操作

    python shutil模块常用操作 高级的 文件.文件夹.压缩包 处理模块 1.将文件内容拷贝至另一个文件中 shutil.copyfileobj(src, dist, length=16*102 ...

  5. CF Round #805 (Div. 3) 题解

    A 直接模拟即可,注意 \(10^k\) 的情况(罚时!罚时!罚时!). A Code using namespace std; typedef long long ll; typedef pair& ...

  6. CSP-J2021 题解

    分糖果 题意 选择L~R中的某个数 , 使得x mod k的结果最大. 思路 分两种情况考虑: 若 L 和 R 对 K 取模后在同一区间,则必然在 x=R 位置取到最大值: 否则 L~R 必然跨越多个 ...

  7. 美女 Committer 手把手教你使用海豚调度

    还在为选哪个调度发愁么?还在为查使用手册愁眉不展么?来来来,先瞧一眼海豚调度的 Slogan:调度选的好,下班回家早.调度用的对,半夜安心睡.为充分贯彻这一宗旨,海豚调度一条龙服务来了,特地邀请海豚社 ...

  8. Vmware 虚拟机连接外网和设置固定IP

    NAT 模式(地址转换模式) 在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,虚拟机借助NAT功能,通过宿主机器所在的网络来 ...

  9. SecureCRT 和 Xshell 连接ENSP 教程

    前言:很多人问我说想尝试使用 CRT和Xshell连接 ENSP的某台设备,以模拟现网中的工作状态,所以出了这篇随笔. ENSP版本: Xshell 连接教程 Xshell 7 评估版(其他版本没测试 ...

  10. [Blender] Blender 获取 Instance 的信息

    最近希望用 Blender 生成 Instance 的能力,将生成的导入游戏引擎中来渲染.Instance Rendering 是个好东西,特别是针对大场景,渲染成批的基本相同的物体的时候非常有用. ...