BZOJ3673 & BZOJ3674 & 洛谷3402:可持久化并查集——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3673
https://www.lydsy.com/JudgeOnline/problem.php?id=3674
https://www.luogu.org/problemnew/show/P3402
这里最强的应该是BZOJ3674,于是接下来讲的内容和代码与BZOJ3674相同而非另外两道题,但核心思维完全一致。
n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0
请注意本题采用强制在线,所给的a,b,k均经过加密,加密方法为x= x xor lastans,lastans的初始值为0
可持久化的你没见过的数据结构,都按照可持久化线段树来做准没错。(flag)
用主席树记录历史版本,维护每个节点的爸爸和启发式合并所需要的并查集的深度。
这样对于2操作只需要把版本号改了即可(程序中是rt[i]=rt[k])。
原find操作可以暴力爬树一步步往上找,启发式合并深度为O(logn),主席树查询一次是O(logn),复杂度就是O(log^2n)。
原union操作就相当于主席树的insert操作,比如fa[u]=v,我们只需要主席树找到代表u的点u0,然后fa[u0]=v即可。
第三个操作有上面的基础就是傻逼操作了。
#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int N=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct tree{
int l,r;
}tr[N*];
int rt[N],fa[N*],dep[N*],n,m,pool;
inline void build(int &x,int l,int r){
x=++pool;
if(l==r){
fa[x]=l;
return;
}
int mid=(l+r)>>;
build(tr[x].l,l,mid);
build(tr[x].r,mid+,r);
}
inline void insert(int y,int &x,int l,int r,int u,int v){
tr[x=++pool]=tr[y];
if(l==r){
fa[x]=v;
return;
}
int mid=(l+r)>>;
if(u<=mid)insert(tr[y].l,tr[x].l,l,mid,u,v);
else insert(tr[y].r,tr[x].r,mid+,r,u,v);
return;
}
inline void add(int y,int &x,int l,int r,int p){
if(l==r){
dep[x]++;
return;
}
int mid=(l+r)>>;
if(p<=mid)add(tr[y].l,tr[x].l,l,mid,p);
else add(tr[y].r,tr[x].r,mid+,r,p);
return;
}
inline int query(int k,int l,int r,int p){
if(l==r)return k;
int mid=(l+r)>>;
if(p<=mid)return query(tr[k].l,l,mid,p);
else return query(tr[k].r,mid+,r,p);
}
inline int find(int k,int x){
while(){
int f=query(rt[k],,n,x);
if(x==fa[f])return f;
x=fa[f];
}
}
inline void unionn(int k,int u,int v){
if(dep[u]>dep[v])swap(u,v);
insert(rt[k],rt[k],,n,fa[u],fa[v]);
if(dep[u]==dep[v])add(rt[k],rt[k],,n,fa[v]);
}
int main(){
n=read(),m=read();
build(rt[],,n);
int ans=;
for(int i=;i<=m;i++){
int op=read();
if(op==){
rt[i]=rt[i-];
int a=find(i,read()^ans),b=find(i,read()^ans);
if(a!=b)unionn(i,a,b);
}
if(op==){
int k=read()^ans;rt[i]=rt[k];
}
if(op==){
rt[i]=rt[i-];
int a=find(i,read()^ans),b=find(i,read()^ans);
printf("%d\n",ans=a==b?:);
}
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ3673 & BZOJ3674 & 洛谷3402:可持久化并查集——题解的更多相关文章
- bzoj3673 & bzoj3674 & 洛谷P3402 可持久化并查集
题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/Jud ...
- 洛谷P3402 可持久化并查集
n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 说是可持久化并查集,实际上是 ...
- Luogu 3402 可持久化并查集
点开这题纯属无聊……不过既然写掉了,那就丢一个模板好了 不得不说,可持久化并查集实现真的很暴力,就是把并查集的数组弄一个主席树可持久化. 有一点要注意的是不能写路径压缩,这样跳版本的时候会错,所以弄一 ...
- 洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边
题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要 ...
- 洛谷P2024 食物链 [NOI2001] 并查集
正解:并查集 解题报告: 传送门(咕了! 其实没有很难(虽然我是交了三发才过的QAQ 但是一来好久没打并查集了恢复一下智力 二来看着智推里唯一一个蓝就很不爽(,,,虽然做了这题之后又补上了个蓝题QAQ ...
- 洛谷P1197 [JSOI2008] 星球大战 [并查集]
题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ...
- 洛谷 P1551 亲戚(并查集模板)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1551 思路: 很显然地我们会发现,这是一道并查集的模板题,并且是考察了并查集中的”并“和”查“的操 ...
- 洛谷P1111修复公路并查集改
看了他们的题解感觉很震惊,为什么要用kruskal,这题要用到最小生成树吗??? 38行短短的程序就可以了,我觉得学习不是一种套用,套自己学的,而且题解很大一部分都是kruskal. 个人认为自己的程 ...
- 洛谷P1525关押罪犯——并查集
题目:https://www.luogu.org/problemnew/show/P1525 并查集+贪心,从大到小排序,将二人分在不同房间,找到第一个不满足的即为答案. 代码如下: #include ...
随机推荐
- Docker - 容器中的tomcat如何使用startup.sh启动
网上大多介绍的catalina.sh启动,因为docker容器中,无法直接启动startup.sh. 解决方法: 编辑catalina.sh,找到 >> "$CATALINA_O ...
- Python Road
引子 雁离群兮不知所归,路遥远兮吾将何往 Python Road[第一篇]:Python简介 Python Road[第二篇]:Python基本数据类型 Python Road[第三篇]:Pyth ...
- 180601-MySql性能监控工具MyTop
文章链接:https://blog.hhui.top/hexblog/2018/06/01/180601-MySql性能监控工具MyTop/ mysql 性能监控小工具之 mytop 参考: How ...
- [Clr via C#读书笔记]Cp3共享程序集和强命名程
Cp3共享程序集和强命名程序集 私有方式部署+全局方式部署:弱命名程序集+强命名程序集 强命名程序集使用发布者的公钥私钥进行签名,唯一标识发布者. 共享dll被全部复制到System32中 强命名程序 ...
- Paper Reading - CNN+CNN: Convolutional Decoders for Image Captioning
Link of the Paper: https://arxiv.org/abs/1805.09019 Innovations: The authors propose a CNN + CNN fra ...
- LeetCode - 13. Roman to Integer - 思考if-else与switch的比较 - ( C++ ) - 解题报告
1.题目: 原题:Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range ...
- asp.net mvc5 模式的现象思考
.net mv5简化了一些应用逻辑,与其说是mvc架构模式,不如说应用.net Entity更好. 现在你只需要去随便创建一个类 相关数据 然后用一个类去继承 DbContext 定义一个 DbSet ...
- ssh连接失败, 记下来原因和解决方案
mac下使用secureCRT发现连接不了虚拟机上的linux 运行 ps -e | grep ssh,查看是否有sshd进程 如果没有,说明server没启动,通过 /etc/init.d/sshd ...
- 算法与数据结构实验题 4.1 伊姐姐数字 game
★实验任务 伊姐姐热衷于各类数字游戏,24 点.2048.数独等轻轻松松毫无压力.一 日,可爱的小姐姐邀请伊姐姐一起玩一种简单的数字 game,游戏规则如下: 一开始桌上放着 n 张数字卡片,从左到右 ...
- Alpha冲刺——第四天
Alpha第四天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...