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:可持久化并查集——题解的更多相关文章

  1. bzoj3673 & bzoj3674 & 洛谷P3402 可持久化并查集

    题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/Jud ...

  2. 洛谷P3402 可持久化并查集

    n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 说是可持久化并查集,实际上是 ...

  3. Luogu 3402 可持久化并查集

    点开这题纯属无聊……不过既然写掉了,那就丢一个模板好了 不得不说,可持久化并查集实现真的很暴力,就是把并查集的数组弄一个主席树可持久化. 有一点要注意的是不能写路径压缩,这样跳版本的时候会错,所以弄一 ...

  4. 洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边

    题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要 ...

  5. 洛谷P2024 食物链 [NOI2001] 并查集

    正解:并查集 解题报告: 传送门(咕了! 其实没有很难(虽然我是交了三发才过的QAQ 但是一来好久没打并查集了恢复一下智力 二来看着智推里唯一一个蓝就很不爽(,,,虽然做了这题之后又补上了个蓝题QAQ ...

  6. 洛谷P1197 [JSOI2008] 星球大战 [并查集]

    题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ...

  7. 洛谷 P1551 亲戚(并查集模板)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1551 思路: 很显然地我们会发现,这是一道并查集的模板题,并且是考察了并查集中的”并“和”查“的操 ...

  8. 洛谷P1111修复公路并查集改

    看了他们的题解感觉很震惊,为什么要用kruskal,这题要用到最小生成树吗??? 38行短短的程序就可以了,我觉得学习不是一种套用,套自己学的,而且题解很大一部分都是kruskal. 个人认为自己的程 ...

  9. 洛谷P1525关押罪犯——并查集

    题目:https://www.luogu.org/problemnew/show/P1525 并查集+贪心,从大到小排序,将二人分在不同房间,找到第一个不满足的即为答案. 代码如下: #include ...

随机推荐

  1. Docker - 容器中的tomcat如何使用startup.sh启动

    网上大多介绍的catalina.sh启动,因为docker容器中,无法直接启动startup.sh. 解决方法: 编辑catalina.sh,找到 >> "$CATALINA_O ...

  2. Python Road

    引子 雁离群兮不知所归,路遥远兮吾将何往   Python Road[第一篇]:Python简介 Python Road[第二篇]:Python基本数据类型 Python Road[第三篇]:Pyth ...

  3. 180601-MySql性能监控工具MyTop

    文章链接:https://blog.hhui.top/hexblog/2018/06/01/180601-MySql性能监控工具MyTop/ mysql 性能监控小工具之 mytop 参考: How ...

  4. [Clr via C#读书笔记]Cp3共享程序集和强命名程

    Cp3共享程序集和强命名程序集 私有方式部署+全局方式部署:弱命名程序集+强命名程序集 强命名程序集使用发布者的公钥私钥进行签名,唯一标识发布者. 共享dll被全部复制到System32中 强命名程序 ...

  5. 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 ...

  6. 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 ...

  7. asp.net mvc5 模式的现象思考

    .net mv5简化了一些应用逻辑,与其说是mvc架构模式,不如说应用.net Entity更好. 现在你只需要去随便创建一个类 相关数据 然后用一个类去继承 DbContext 定义一个 DbSet ...

  8. ssh连接失败, 记下来原因和解决方案

    mac下使用secureCRT发现连接不了虚拟机上的linux 运行 ps -e | grep ssh,查看是否有sshd进程 如果没有,说明server没启动,通过 /etc/init.d/sshd ...

  9. 算法与数据结构实验题 4.1 伊姐姐数字 game

    ★实验任务 伊姐姐热衷于各类数字游戏,24 点.2048.数独等轻轻松松毫无压力.一 日,可爱的小姐姐邀请伊姐姐一起玩一种简单的数字 game,游戏规则如下: 一开始桌上放着 n 张数字卡片,从左到右 ...

  10. Alpha冲刺——第四天

    Alpha第四天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...