【bzoj3674】 可持久化并查集加强版
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】 可持久化并查集加强版的更多相关文章
- bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...
- BZOJ3674: 可持久化并查集加强版
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3674 题解:主要是可持久化的思想.膜拜了一下hzwer的代码后懂了. 其实本质是可持久化fa数 ...
- 2019.01.21 bzoj3674: 可持久化并查集加强版(主席树+并查集)
传送门 题意:维护可持久化并查集,支持在某个版本连边,回到某个版本,在某个版本 询问连通性. 思路: 我们用主席树维护并查集fafafa数组,由于要查询历史版本,因此不能够用路径压缩. 可以考虑另外一 ...
- [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky
思路: 用主席树维护并查集森林,每次连接时新增结点. 似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直 ...
- BZOJ3674 可持久化并查集加强版 可持久化 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3674 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...
- 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树
[BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ...
- 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 用可持久化线段树维护可持久化数组从而实现可持 ...
- 【BZOJ3674】可持久化并查集加强版
可持久化并查集我觉得就是可持久化数组的一种应用.可持久化数组,顾名思义,就是有历史版本的数组,那么如果我们暴力修改储存的话,修改O(n)查询O(1),空间O(n*m),这样肯定不可行,那么我们发现主席 ...
- bzoj3674 可持久化并查集
我是萌萌的任意门 可持久化并查集的模板题-- 做法好像很多,可以标号法,可以森林法. 本来有O(mloglogn)的神算法(按秩合并+倍增),然而我这种鶸渣就只会写O(mlog2n)的民科算法--再加 ...
随机推荐
- web standards
http://www.w3.org/standards/ http://www.webstandards.org/learn/faq/#p213 http://www.w3.org/standards ...
- zabbix常用术语
zabbix常用术语
- C# 生成windows 服务打包程序
c# 开发windows服务程序. 一个简单的服务程序示例. 归纳了几点.有不足之处,请赐教. 一.创建服务程序 1. 菜单栏“文件”--->“新建”--->“项目”,在项目类型中选择“w ...
- Theano2.1.10-基础知识之循环
来自:http://deeplearning.net/software/theano/tutorial/loop.html loop 一.Scan 一个递归的通常的形式,可以用来作为循环语句. 约间和 ...
- 深入理解OOP(三):多态和继承(动态绑定和运行时多态)
在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...
- 关于.Net的面试遐想
概述 这几天更新相关的面试题目,主是要针对有4年或以上经验的面试者,总体来说,发现面试人员的答题效果和预期相差比较大,我也在想是不是我出的题目偏离现实,但我更愿意相信,是我们一些.Net开发者在工作中 ...
- 以HTML为表现的日志记录组件
日志搬家:http://www.loogn.net/blog/Article.aspx?id=21 关于日志记录,如果你不想随用随写,又不想用log4net的话,也许你可以了解一下这个! 我也是个很懒 ...
- JavaScript UI选型及Jquery EasyUI使用经验谈
最近由于项目需要,对js UI作了一些简单的了解和使用,有自己的一些想法,在这里留个记录. 当然,我的专注点在管理系统的范围内,所以互联网网站及其他形态的应用这里不提及,所以jQuery UI和Boo ...
- 【Alpha版本】冲刺阶段——Day 3
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- JS是按值传递还是按引用传递
按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本.修改形参的值并不会影响实参. 按引用传递(call by reference)时,函数的形参接收实参的隐式 ...