模板Link Cut Tree (动态树)
题目描述
给定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和。
输入输出样例
说明
数据范围: 1≤N,M≤3⋅105
算法原理提供可靠网址:
这道题用到的技巧:
找根:$makeroot(o)$后一直往左走。最后一个节点就是根。(理由:由于$LCT$中$splay$的性质:按深度作为键值);
判断是否之间有边:再$cut$之前,判断根的左儿子是否是另外一个点。(理由:若存在边,则包含这条边的$splay$只有两个节点)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int xr[],ch[][],val[],pre[],n,m;
bool isrt[],rev[];
void pushup(int o)
{
if (!o) return;
xr[o]=xr[ch[o][]]^xr[ch[o][]]^val[o];
}
void pushdown(int o)
{
if (!o) return;
if (rev[o])
{
int ls=ch[o][],rs=ch[o][];
if (ls)
{
rev[ls]^=;
swap(ch[ls][],ch[ls][]);
}
if (rs)
{
rev[rs]^=;
swap(ch[rs][],ch[rs][]);
}
rev[o]=;
}
}
void push(int o)
{
if (isrt[o]==)
push(pre[o]);
pushdown(o);
}
void rotate(int o,bool kind)
{
int p=pre[o];
ch[p][!kind]=ch[o][kind];pre[ch[o][kind]]=p;
if (isrt[p]) isrt[o]=,isrt[p]=;
else ch[pre[p]][ch[pre[p]][]==p]=o;
pre[o]=pre[p];
ch[o][kind]=p;pre[p]=o;
pushup(p);pushup(o);
}
void splay(int o)
{
push(o);
while (isrt[o]==)
{
if (isrt[pre[o]])
rotate(o,ch[pre[o]][]==o);
else
{
int p=pre[o],kind=ch[pre[p]][]==p;
if (ch[p][kind]==o)
rotate(o,!kind),rotate(o,kind);
else rotate(p,kind),rotate(o,kind);
}
}
}
void access(int o)
{
int y=;
while (o)
{
splay(o);
//xr[o]^=xr[ch[o][1]];
isrt[ch[o][]]=;isrt[ch[o][]=y]=;
pushup(o);
o=pre[y=o];
}
}
void makeroot(int o)
{
access(o);
splay(o);
rev[o]^=;
swap(ch[o][],ch[o][]);
}
int find(int o)
{
makeroot(o);
access(o);splay(o);
while (ch[o][])
{
o=ch[o][];
}
return o;
}
void link(int x,int y)
{
makeroot(x);
pre[x]=y;
}
void cut(int x,int y)
{
makeroot(x);access(y);splay(y);
if (ch[y][]!=x) return;
pre[x]=;
ch[y][]=;
isrt[x]=;
pushup(y);
}
int main()
{int i,c,x,y;
cin>>n>>m;
for (i=;i<=n;i++)
{
scanf("%d",&val[i]);
xr[i]=val[i];isrt[i]=;
}
for (i=;i<=m;i++)
{
scanf("%d%d%d",&c,&x,&y);
if (c==)
{
makeroot(y);
access(x);
splay(x);
printf("%d\n",xr[x]);
}
else if (c==)
{
int p=find(x),q=find(y);
if (p!=q) link(x,y);
}
else if (c==)
{
cut(x,y);
}
else if (c==)
{
val[x]=y;
makeroot(x);
pushup(x);
}
}
}
模板Link Cut Tree (动态树)的更多相关文章
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷.3690.[模板]Link Cut Tree(动态树)
题目链接 LCT(良心总结) #include <cstdio> #include <cctype> #include <algorithm> #define gc ...
- Link Cut Tree 动态树 小结
动态树有些类似 树链剖分+并查集 的思想,是用splay维护的 lct的根是动态的,"轻重链"也是动态的,所以并没有真正的轻重链 动态树的操作核心是把你要把 修改/询问/... 等 ...
- LCT(link cut tree) 动态树
模板参考:https://blog.csdn.net/saramanda/article/details/55253627 综合各位大大博客后整理的模板: #include<iostream&g ...
- 洛谷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),代 ...
- 【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)
题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
- P3690 【模板】Link Cut Tree (动态树)
P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> v ...
- LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板
P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...
随机推荐
- Java字符编码浅析
Java基本类型占用的字节数:1字节: byte , boolean2字节: short , char4字节: int , float8字节: long , double注:1字节(byte)=8位( ...
- bisect 二分查找
先说明的是,使用这个模块的函数前先确保操作的列表是已排序的. 先看看 insort 函数: 其插入的结果是不会影响原有的排序. 再看看 bisect 函数: 其目的在于查找该数值将会插入的位置并返 ...
- mysql基础篇 - 其他基本操作
基础篇 - 其他基本操作 其他基本操作 一.实验简介 本节实验中我们将学习并实践数据库的其他基本操作:索引.视图,导入和导出,备份和恢复等. 这些概念对于数据库管理员而言都非常重要,请 ...
- Telnet、SSH和VNC 区别
Telnet Telnet是进行远程登录的标准协议,它是当今Internet上应用最广泛的协议之一.它把用户正在使用的终 端或计算机变成网络某一远程主机的仿真终端,使得用户可以方便地使用远程主机上的软 ...
- 【nodejs】安装browser-sync 遇到错误提示
首先我用的是mac电脑在我执行安装browser-sync时遇到如下问题: 因为不被允许所以我只能不安装全局了: 但是又出现了如下的新问题 纠结了半个小时,终于知道为什么会出现这个问题了, node只 ...
- nyoj 第几是谁
第几是谁? 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有"abcdefghijkl"12个字符,将其按字典序排列,如果给出任意一种排列, ...
- JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用
配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...
- 算法题丨4Sum
描述 Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...
- Redux应用单一的store原则案例详解
在开发reac单页面应用的时候,页面的展示逻辑跟数据状态的关系管理变得越来越复杂,redux很好的解决这个问题.废话不多说,直接先上官网api链接. http://cn.redux.js.org/in ...
- 阿里云API网关(13)请求身份识别:客户端请求签名和服务网关请求签名
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...