[BZOJ3673&3674]可持久化并查集&加强版
题目大意:让你实现一个可持久化的并查集(3674强制在线)。
解题思路:刚刚介绍了一个叫rope的神器:我是刘邦,在这两题(实际上两题没什么区别)就派上用场了。
正解应该是主席树||可持久化平衡树,然而rope就是可持久化平衡树呵!
只需将rope当做数组般使用,并查集即可。
BZOJ3673 C++ Code:
#include<cstdio>
#include<ext/rope>
typedef __gnu_cxx::rope<int> rp;
rp *f[20005];
int n,m,i;
int a[20005];
int dad(int x){
int p;
if((p=f[i]->at(x))==x)return x;
f[i]->replace(x,dad(p));
return f[i]->at(x);
}
int main(){
scanf("%d%d",&n,&m);
for(i=0;i<=n;++i)a[i]=i;
f[0]=new rp(a,a+n+1);
for(i=1;i<=m;++i){
f[i]=new rp(*f[i-1]);
int op;
scanf("%d",&op);
if(op==1){
int u,v;
scanf("%d%d",&u,&v);
u=dad(u),v=dad(v);
if(u!=v)f[i]->replace(v,u);
}else
if(op==2){
int t;
scanf("%d",&t);
f[i]=new rp(*f[t]);
}else{
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",dad(u)==dad(v)?1:0);
}
}
return 0;
}
而对于3674,唯一的问题就是路径压缩时,如果结果与当前值相等,就不需要更改值了,否则会炸内存MLE!
BZOJ3674 C++ Code:
#include<cstdio>
#include<ext/rope>
typedef __gnu_cxx::rope<int> rp;
rp *f[200005];
int n,m,i,lst;
int a[200005];
int dad(int x){
int p;
if((p=f[i]->at(x))==x)return x;
p=dad(p);
if(f[i]->at(x)==p)return p;
f[i]->replace(x,p);
return f[i]->at(x);
}
int main(){
scanf("%d%d",&n,&m);
for(i=0;i<=n;++i)a[i]=i;
f[0]=new rp(a,a+n+1);
for(i=1;i<=m;++i){
f[i]=new rp(*f[i-1]);
int op;
scanf("%d",&op);
if(op==1){
int u,v;
scanf("%d%d",&u,&v);
u=dad(u^lst),v=dad(v^lst);
if(u!=v)f[i]->replace(v,u);
}else
if(op==2){
int t;
scanf("%d",&t);
f[i]=new rp(*f[t^lst]);
}else{
int u,v;
scanf("%d%d",&u,&v);
u^=lst;v^=lst;
printf("%d\n",lst=dad(u)==dad(v)?1:0);
}
}
return 0;
}
[BZOJ3673&3674]可持久化并查集&加强版的更多相关文章
- [bzoj3673/3674可持久化并查集加强版]
n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2 ...
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- BZOJ 3674 可持久化并查集加强版(按秩合并版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)
CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
- BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...
- BZOJ 3674 可持久化并查集加强版(主席树变形)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2515 Solved: 1107 [Submit][Sta ...
- bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)
Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...
- BZOJ3673/3674:可持久化并查集
Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...
随机推荐
- python3 django动态分页引发的list切片下标越界问题
起先是扒了一个包,动态分页的,但这个包分页之前要加载全部的数据,我这东西后台是个爬虫,不一定浏览的完所以这么做有点浪费资源,于是我改造了一下. # :param obj_count: 获得 条目总数# ...
- jupyter的安装
3.6:\Lib\site-packages\pip\models\index.py # PyPI = Index('https://pypi.python.org/') # 替换成 PyPI = I ...
- 扩展Jmeter--BeanShell进行java扩展
1.在eclipse中写第一个java 程序,导出成jar文件,在Jmeter安装文件下新建一个dependences文件夹,将导出的.jar包文件放在文件夹下. 2.修改Jmter安装文件bin目录 ...
- React-setState源码的理解
首先举一个最简单的例子: this.state={ a:1 } this.setState({ a:2 }) console.log(this.state.a)//1 可以说setState()操作是 ...
- jQuery Validate验证(项目中使用的)
大致结构是: <script type="text/javascript" src="<%=path %>/js/jquery-1.9.1.min.js ...
- [luogu4035 JSOI2008] 球形空间产生器 (矩阵 高斯消元)
传送门 题目描述 有一个球形空间产生器能够在 nnn 维空间中产生一个坚硬的球体.现在,你被困在了这个 nnn 维球体中,你只知道球面上 n+1n+1n+1 个点的坐标,你需要以最快的速度确定这个 n ...
- 1、使用Python3爬取美女图片-网站中的每日更新一栏
此代码是根据网络上其他人的代码优化而成的, 环境准备: pip install lxml pip install bs4 pip install urllib #!/usr/bin/env pytho ...
- 实现双向数据绑定mvvm
实现双向数据绑定mvvm
- visual studio 2017 使用码云gitee进行源代码管理
在码云新建项目 复制项目地址 visual studio 操作 新建项目 提交到码云
- java--web学习总结<转>
http://www.cnblogs.com/xdp-gacl/p/3729033.html