BZOJ3673 可持久化并查集 by zky 【主席树】
BZOJ3673 可持久化并查集 by zky
Description
n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0
0<n,m<=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 【主席树】的更多相关文章
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集 ...
- bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...
- BZOJ 3674 可持久化并查集加强版(主席树变形)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2515 Solved: 1107 [Submit][Sta ...
- [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)
Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...
- 2019.01.21 bzoj3674: 可持久化并查集加强版(主席树+并查集)
传送门 题意:维护可持久化并查集,支持在某个版本连边,回到某个版本,在某个版本 询问连通性. 思路: 我们用主席树维护并查集fafafa数组,由于要查询历史版本,因此不能够用路径压缩. 可以考虑另外一 ...
- [bzoj3673] 可持久化并查集 by zky
总感觉到现在才来写这题有点奇怪. 并查集如果按秩合并的话,每次合并只会修改一个点的父亲. 用可持久化线段树来实现可持久化数组就行了.. 然而我写的是按子树大小合并..结果比按秩合并慢了一点>_& ...
- [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky
思路: 用主席树维护并查集森林,每次连接时新增结点. 似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直 ...
- bzoj3673: 可持久化并查集 by zky&&3674: 可持久化并查集加强版
主席树可持久化数组,还挺好YY的 然而加强版要路径压缩.. 发现压了都RE 结果看了看数据,默默的把让fx的父亲变成fy反过来让fy的父亲变成fx 搞笑啊 #include<cstdio> ...
- BZOJ3673 可持久化并查集 by zky 可持久化 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3673 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...
随机推荐
- Eclipse安卓项目导入android.support.design报错的解决办法
导入android.support.design出错:1.项目除了需要依赖appcompat_v7包外还要design包2.design包就是在安卓sdk下Extras中的android.suppor ...
- keepalived与nginx安装
目的: 当用户请求访问时,会通过nginx来访问web服务应用,因此我们必须要保证nginx的高可用,要保证nginx的高可用,我们需要通过keepalived来监控nginx,并对外提供1个虚拟的v ...
- mvn deploy返回400错误的几种可能
user credentials are wrong url to server is wrong user does not have access to the deployment reposi ...
- SpringBoot学习(2)
三.日志 1.日志框架 springboot:底层是spring框架,spring框架默认使用JCL; springboot选用SLF4j和logback; 2.SLF4j使用 1.如何在系统中使用S ...
- hand first python 选读(2)
文件读取与异常 文件读取与判断 os模块是调用来处理文件的. 先从最原始的读取txt文件开始吧! 新建一个aaa.txt文档,键入如下英文名篇: Li Lei:"Hello,Han Meim ...
- ctci1.2
; ; i < len/; i++){ tmp = *(str+i); *(str+i) = *(str+len--i); *(str+l ...
- 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现
重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...
- 重新学习MySQL数据库5:根据MySQL索引原理进行分析与优化
重新学习MySQL数据库5:根据MySQL索引原理进行分析与优化 一:Mysql原理与慢查询 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能 ...
- Pytorch CNN的各种参数
class Model(torch.nn.Module): def __init__(self): super(Model, self).__init__() self.conv1 = torch.n ...
- PHP 中使用explode()函数切割字符串为数组
explode()函数的作用:使用一个字符串分割另一个字符串,打散为数组. 例如: 字符串 $pizza = "第1 第2 第3 第4 第5 第6"; 根据空格分割后:$piece ...