http://www.lydsy.com/JudgeOnline/problem.php?id=3674 (题目链接)

题意

  维护并查集3个操作:合并;回到完成第k个操作后的状态;查询。

Solution

  其实就是用主席树的叶子节点维护并查集的可持久化数组fa[]。

细节

  终于认识到了按秩合并的强大,单纯写个路径压缩Re飞,写了路径压缩+按秩合并比单纯的按秩合并没快多少→_→

代码

// bzoj3674
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=200010,maxm=10000010;
struct tree {int ls,rs;}tr[maxm];
int fa[maxm],deep[maxm],rt[maxn],n,m,sz; void build(int &k,int l,int r) {
if (!k) k=++sz;
if (l==r) {fa[k]=l;return;}
int mid=(l+r)>>1;
build(tr[k].ls,l,mid);
build(tr[k].rs,mid+1,r);
}
void update(int &k1,int k2,int l,int r,int x,int val) {
k1=++sz;tr[k1]=tr[k2];
int mid=(l+r)>>1;
if (l==r) {fa[k1]=val,deep[k1]=deep[k2];return;}
if (x<=mid) update(tr[k1].ls,tr[k2].ls,l,mid,x,val);
else update(tr[k1].rs,tr[k2].rs,mid+1,r,x,val);
}
void add(int k,int l,int r,int x) {
if (l==r) {deep[k]++;return;}
int mid=(l+r)>>1;
if (x<=mid) add(tr[k].ls,l,mid,x);
else add(tr[k].rs,mid+1,r,x);
}
int query(int k,int l,int r,int x) {
int mid=(l+r)>>1;
if (l==r) return k;
if (x<=mid) return query(tr[k].ls,l,mid,x);
else return query(tr[k].rs,mid+1,r,x);
}
int find(int k,int x) {
int p=query(k,1,n,x);
if (x==fa[p]) return p;
int t=find(k,fa[p]);
update(k,k,1,n,fa[p],fa[t]);
return t;
}
int main() {
scanf("%d%d",&n,&m);
build(rt[0],1,n);
int ans=0;
for (int op,a,b,i=1;i<=m;i++) {
scanf("%d",&op);
if (op==1) {
rt[i]=rt[i-1];
scanf("%d%d",&a,&b);a^=ans,b^=ans;
int r1=find(rt[i],a),r2=find(rt[i],b);
if (fa[r1]==fa[r2]) continue;
//if (deep[r1]>deep[r2]) swap(r1,r2);
update(rt[i],rt[i-1],1,n,fa[r1],fa[r2]);
//if (deep[r1]==deep[r2]) add(rt[i],1,n,fa[r2]);
}
if (op==2) {scanf("%d",&a);a^=ans;rt[i]=rt[a];}
if (op==3) {
rt[i]=rt[i-1];
scanf("%d%d",&a,&b);
a^=ans,b^=ans;
int r1=find(rt[i],a),r2=find(rt[i],b);
ans=fa[r1]==fa[r2] ? 1 : 0;
printf("%d\n",ans);
}
}
return 0;
}

  

【bzoj3674】 可持久化并查集加强版的更多相关文章

  1. bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版

    bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...

  2. BZOJ3674: 可持久化并查集加强版

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3674 题解:主要是可持久化的思想.膜拜了一下hzwer的代码后懂了. 其实本质是可持久化fa数 ...

  3. 2019.01.21 bzoj3674: 可持久化并查集加强版(主席树+并查集)

    传送门 题意:维护可持久化并查集,支持在某个版本连边,回到某个版本,在某个版本 询问连通性. 思路: 我们用主席树维护并查集fafafa数组,由于要查询历史版本,因此不能够用路径压缩. 可以考虑另外一 ...

  4. [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky

    思路: 用主席树维护并查集森林,每次连接时新增结点. 似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直 ...

  5. BZOJ3674 可持久化并查集加强版 可持久化 并查集

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3674 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...

  6. 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树

    [BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ...

  7. BZOJ 3674 可持久化并查集加强版(路径压缩版本)

    /* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...

  8. BZOJ 3674 可持久化并查集加强版(按秩合并版本)

    /* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...

  9. 【BZOJ3674】可持久化并查集加强版

    可持久化并查集我觉得就是可持久化数组的一种应用.可持久化数组,顾名思义,就是有历史版本的数组,那么如果我们暴力修改储存的话,修改O(n)查询O(1),空间O(n*m),这样肯定不可行,那么我们发现主席 ...

  10. bzoj3674 可持久化并查集

    我是萌萌的任意门 可持久化并查集的模板题-- 做法好像很多,可以标号法,可以森林法. 本来有O(mloglogn)的神算法(按秩合并+倍增),然而我这种鶸渣就只会写O(mlog2n)的民科算法--再加 ...

随机推荐

  1. squid代理服务器根据代理IP路由

    import os ips = os.popen("""ifconfig |grep 'inet addr:'|awk '{print $2}'| sed '$d'| s ...

  2. java多线程系类:JUC原子类:02之AtomicLog原子类

    概要 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.本章以AtomicLong对基本类型的原子类进行介绍.内容包括:Atomic ...

  3. android中常用的读取文件的用法如下

    1. 从resource的raw中读取文件数据: String res = ""; try{ //得到资源中的Raw数据流 InputStream in = getResource ...

  4. Linux shell程序一

    设计一个Shell程序,在/$HONE/test目录下建立50个目录,即user1-user50, 并设置每个目录的权限,其中其他用户的权限为:读:文件所有者的权限为: 读.写.执行:文件所有者所在组 ...

  5. Word中的字体大小

    Word中的字体大小(几号-几磅)   Word对字体大小采用两种不同的度量单位,其中一种是以"号"为度量单位,如常用的"初号.小初.一号.小一--七号.八号" ...

  6. 实验三 敏捷开发与XP实践

    实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验 ...

  7. Qt学习笔记 线程(一)

    Qt中的线程是与平台无关的 QThread 提供了创建一个新线程的方法 新建一个线程,继承QThread并重写它的run()当调用 start()函数时会调用重载的run()函数 例: #ifndef ...

  8. 产品列表页分类筛选、排序的算法实现(PHP)

    一.简单的单条件查询 工作都是从简单的开始,先从最简单的单表查询开始,这个一般用在首页以及一些比较独立的页面,只需要查找几个符合条件的产品展示出来即可,可以使用分页或者不使用分页.下面这个是产品控制器 ...

  9. .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)

    最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了,程序有Bug,一步步断点跟 ...

  10. O2O营销模式(Online To Offline)

    什么是O2O营销模式 O2O营销模式又称离线商务模式,是指线上营销线上购买带动线下经营和线下消费.O2O通过打折.提供信息.服务预订等方式,把线下商店的消息推送给互联网用户,从而将他们转换为自己的线下 ...