【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)的民科算法--再加 ...
随机推荐
- NodeJS 开篇 牛刀小试
一.Node&NPM的安装与配置 下载:https://nodejs.org/en/ V4.2.x LTS(9.75MB)——长期支持版,成熟可靠 V5.x.x Stable(9.71MB)— ...
- 【点滴积累,厚积薄发】windows schedule task中.exe程序的路径问题等问题总结
1.在发布ReportMgmt的Job时遇到一个路径问题,代码如下: doc.Load(@"Configuration\Business\business.config"); ...
- Html5 Egret游戏开发 成语大挑战(一)开篇
最近接触了Egret白鹭引擎,感觉非常好用,提供了各种各样的开发工具让开发者和设计者更加便捷,并且基于typescript语言开发省去了很多学习成本,对于我们这种掉微软坑许久的童鞋来说,确实很有吸引力 ...
- QT 数据库编程四
//vmysql.cpp #include "vmysql.h" #include <QMessageBox> Vmysql::Vmysql() { mysql_ini ...
- QT QToolBox类
QToolBox类的创建 //drawer.h #ifndef DRAWER_H #define DRAWER_H #include <QToolBox> #include <QTo ...
- SQL 批量修改表结构
项目中发现一批语言表的某个字段设的值太小了需要增大,因为涉及到很多张表,所以采用游标一张张的处理. 代码很简单 ) ) DECLARE LangTable CURSOR FOR SELECT name ...
- Sql server使用Merge关键字做插入或更新操作
Merge是关于对于两个表之间的数据进行操作的. 要使用Merge的场景比如: 数据同步 数据转换 基于源表对目标表做Insert,Update,Delete操作 MERGE语句的基本语法: MERG ...
- 出现“System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部”错误的解决方案
Sql Server2008数据库在还原时出现如下错误信息:System.Data.SqlClient.SqlError: 尚未备份数据库<数据库名称>的日志尾部.如果该日志包含您不希望丢 ...
- spring MVC学习笔记
为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平.你的一个决定会影响团队未来的几年.要考虑方面太多: 1.简单易用,以提高开发效率.使小部分的精力在框架上,大部 ...
- 【Zeyphr】分页查询与修改
分页查询: return this.GetDynamicListWithPaging(ParamQuery.Instance() .From("P_Resume") .AndWhe ...