BZOJ3673 可持久化并查集 by zky


Description

n个集合 m个操作

操作:

1 a b 合并a,b所在集合

2 k 回到第k次操作之后的状态(查询算作操作)

3 a b 询问a,b是否属于同一集合,是则输出1否则输出0

0&lt;n,m&lt;=2∗104" role="presentation" style="position: relative;">0<n,m<=2∗1040<n,m<=2∗104

Sample Input

5 6

1 1 2

3 1 2

2 0

3 1 2

2 1

3 1 2

Sample Output

1

0

1


就是并查集吗,只需要可持久化一个数组就完了

然后主席树可以很方便地实现

模拟一下并查集操作模式就好了


#include<bits/stdc++.h>
using namespace std;
#define N 200010
int n,m,tot=0;
int rt[N],ls[N],rs[N],val[N],dep[N];
void build(int &t,int l,int r){
if(l>r)return;
t=++tot;
if(l==r){val[t]=l;dep[t]=1;return;}
int mid=(l+r)>>1;
build(ls[t],l,mid);
build(rs[t],mid+1,r);
}
void modify(int &t,int last,int l,int r,int pos,int vl){
t=++tot;
if(l==r){val[t]=vl;dep[t]=dep[last];return;}
ls[t]=ls[last];
rs[t]=rs[last];
int mid=(l+r)>>1;
if(pos<=mid)modify(ls[t],ls[last],l,mid,pos,vl);
else modify(rs[t],rs[last],mid+1,r,pos,vl);
}
int query(int t,int l,int r,int pos){
if(l==r)return t;
int mid=(l+r)>>1;
if(pos<=mid)return query(ls[t],l,mid,pos);
else return query(rs[t],mid+1,r,pos);
}
void add(int t,int l,int r,int pos){
if(l==r){dep[t]++;return;}
int mid=(l+r)>>1;
if(pos<=mid)add(ls[t],l,mid,pos);
else add(rs[t],mid+1,r,pos);
}
int find(int t,int x){
int p=query(t,1,n,x);
if(x==val[p])return p;
return find(t,val[p]);
}
int main(){
scanf("%d%d",&n,&m);
build(rt[0],1,n);
for(int i=1;i<=m;i++){
int op,x,y;scanf("%d",&op);
if(op==1){
rt[i]=rt[i-1];
scanf("%d%d",&x,&y);
int fax=find(rt[i],x);
int fay=find(rt[i],y);
if(val[fax]==val[fay])continue;
if(dep[fax]>dep[fay])swap(fax,fay);
modify(rt[i],rt[i-1],1,n,val[fax],val[fay]);
if(dep[fax]==dep[fay])add(rt[i],1,n,val[fay]);
}else if(op==2){
scanf("%d",&x);
rt[i]=rt[x];
}else if(op==3){
rt[i]=rt[i-1];
scanf("%d%d",&x,&y);
int fax=find(rt[i],x);
int fay=find(rt[i],y);
if(val[fax]==val[fay])printf("1\n");
else printf("0\n");
}
}
return 0;
}


BZOJ3673 可持久化并查集 by zky 【主席树】的更多相关文章

  1. Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)

    3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集 ...

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

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

  3. BZOJ 3674 可持久化并查集加强版(主席树变形)

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 2515  Solved: 1107 [Submit][Sta ...

  4. [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

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

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

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

  6. [bzoj3673] 可持久化并查集 by zky

    总感觉到现在才来写这题有点奇怪. 并查集如果按秩合并的话,每次合并只会修改一个点的父亲. 用可持久化线段树来实现可持久化数组就行了.. 然而我写的是按子树大小合并..结果比按秩合并慢了一点>_& ...

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

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

  8. bzoj3673: 可持久化并查集 by zky&&3674: 可持久化并查集加强版

    主席树可持久化数组,还挺好YY的 然而加强版要路径压缩.. 发现压了都RE 结果看了看数据,默默的把让fx的父亲变成fy反过来让fy的父亲变成fx 搞笑啊 #include<cstdio> ...

  9. BZOJ3673 可持久化并查集 by zky 可持久化 并查集

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

随机推荐

  1. maven--spring-boot-starter-parent 小结

    Maven中的dependency的scope作用域详解 https://blog.csdn.net/itchiang/article/details/45009057 https://blog.cs ...

  2. php温习-变量,常量

    1.变量 内存中用于临时存储数据的一个空间,空间有一个名字子,变量都是以$开头 预定义变量:  $_GET  $_POST  $_REQUEST   $_SEVER  $_SEESION  $_COO ...

  3. wireshark初学者使用

    介绍 Wireshark是一款网络封包分析软件,截取网络封包,显示其封包的详细信息.日常工作中用的比较多.在使用wireshark之前须了解常用的网络协议.如:tcp,http,ip,udp等.(其实 ...

  4. ssh原理与应用

    一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会 ...

  5. 优先队列PriorityQueue实现 大小根堆 解决top k 问题

    转载:https://www.cnblogs.com/lifegoesonitself/p/3391741.html PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于 ...

  6. css3之calc()

    初识calc() 在使用calc()之前,我也只是听说有这么一个东西,但在用过之后我才发现这个功能其实很实用. calc()其实就是英文calculate(计算)的缩写,它看起来像个函数吧? 其实不是 ...

  7. request.getPathInfo() 方法的作用

    request.getPathInfo(); 这个方法返回请求的实际URL相对于请求的serlvet的url的路径.(个人理解.) 比如,有一个Servlet的映射是这样配置的: <servle ...

  8. HDU 3779 Railroad(记忆化搜索)

    Railroad Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Subm ...

  9. Easy UI DataGrid 与 分页

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...

  10. Annotation方式实现AOP

    1.添加其他jar包 2.配置applicationContext.xml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?xml version=&quo ...