[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& ...
随机推荐
- SASS概览
1.安装: sass需要使用ruby,首先安装ruby,之后: gem install sass 编译: sass input.scss output.css 2.快速入门: 变量: .scss 变量 ...
- G700存储配置
首先在G700上创建RAID组,这次选择的是SSD做RAID5,SAS磁盘做的是RAID10,把空闲的物理磁盘加入RAID组内,把已分配给RAID组的物理磁盘全部加在一次资源池里面pool 创建主机组 ...
- ARM - Linux嵌入式C/C++各种资料分享【更新日期:2012/04/24】
http://blog.csdn.net/shuxiao9058/article/details/6786868 由于115网盘取消大众分享功能,因此不能继续分享下载链接.更新资料将在本人分享空间转存 ...
- 大道至简第一章读后感 Java伪代码形式
观看了大道至简的第一章之后,从愚公移山的故事中我们可以抽象出一个项目, 下面用Java 伪代码的形式来进行编写: import java(愚公移山的故事) //愚公移山 public class yu ...
- js实现点击复制网页内容(基于execCommand)
通过execCommand方法来实现,当一个HTML文档切换到设计模式 designMode时,文档对象暴露 execCommand 方法,该方法允许运行命令来操纵可编辑区域的内容.大多数命令影响文档 ...
- js 对象的创建方式和对象的区别
js一个有三种方法创建对象,这里做一个总结. 1.对象直接量 所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议, 1 2 3 4 5 6 7 8 9 10 11 12 ...
- DQL查询语句使用(select)
9)DQL查询语句使用 SELECT语句在PL/SQL中使用,必须 采用下面用法: select id INTO 变量 from t001 where id=5; 将记录字段 ...
- DQL命令(查询)
select *或字段1,字段2... from 表名 [where 条件] 提示:*符号表示取表中所有列:没有where语句表示 查询表中所有记录:有wh ...
- 洛谷 P2700 逐个击破
P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,毛主席制 ...
- android 读取xml
在有些应用中,有一点小数据.直接存储在XML就是.实现较为简单, 1.xml文件放入asset目录.结构如: <?xml version="1.0" encoding=&qu ...