BZOJ3673/3674:可持久化并查集
Description
n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0
0<n,m<=2*10^4
Input
Output
Sample Input
1 1 2
3 1 2
2 0
3 1 2
2 1
3 1 2
Sample Output
1
0
1
Solution
板子题……只不过网上有很多假做法。
具体做法就是整两个可持久化数组(不知道谁起的这么鬼畜的名字……我还是更喜欢叫他可持久化线段树)来记录并查集的$fa$数组和$dep$数组。因为路径压缩会破坏可持久化的结构,所以我们只能记录$dep$数组来按秩合并。
网上很多只搞了一颗可持久化线段树,维护$fa$就可持久化线段树$insert$一条链,维护$dep$就修改历史版本上的点的做法是错的……已经被卡掉了QAQ
Code
#include<iostream>
#include<cstdio>
#define N (200009)
using namespace std; int n,m,lastans,opt,x,y; struct Tree
{
struct Sgt{int ls,rs,v;}Segt[N*];
int sgt_num,a[N],Root[N];
int Build(int l,int r)
{
int now=++sgt_num;
if (l==r) {Segt[now].v=a[l]; return now;}
int mid=(l+r)>>;
Segt[now].ls=Build(l,mid);
Segt[now].rs=Build(mid+,r);
return now;
}
int Update(int pre,int l,int r,int x,int v)
{
int now=++sgt_num;
Segt[now].ls=Segt[pre].ls;
Segt[now].rs=Segt[pre].rs;
if (l==r) {Segt[now].v=v; return now;}
int mid=(l+r)>>;
if (x<=mid) Segt[now].ls=Update(Segt[now].ls,l,mid,x,v);
else Segt[now].rs=Update(Segt[now].rs,mid+,r,x,v);
return now;
}
int Query(int now,int l,int r,int x)
{
if (l==r) return Segt[now].v;
int mid=(l+r)>>;
if (x<=mid) return Query(Segt[now].ls,l,mid,x);
else return Query(Segt[now].rs,mid+,r,x);
}
}CT[]; int Find(int x,int t)
{
int fa=CT[].Query(CT[].Root[t],,n,x);
return x==fa?x:Find(fa,t);
} int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=n; ++i)
CT[].a[i]=i, CT[].a[i]=;
CT[].Root[]=CT[].Build(,n);
CT[].Root[]=CT[].Build(,n);
for (int i=; i<=m; ++i)
{
scanf("%d",&opt);
if (opt==)
{
CT[].Root[i]=CT[].Root[i-];
CT[].Root[i]=CT[].Root[i-];
scanf("%d%d",&x,&y);
/*x^=lastans; y^=lastans;*/
int fx=Find(x,i),fy=Find(y,i);
if (fx==fy) continue;
int dfx=CT[].Query(CT[].Root[i],,n,fx);
int dfy=CT[].Query(CT[].Root[i],,n,fy);
if (dfx>dfy) swap(fx,fy);
CT[].Root[i]=CT[].Update(CT[].Root[i],,n,fx,fy);
if (dfx!=dfy) continue;
CT[].Root[i]=CT[].Update(CT[].Root[i],,n,fy,dfy+);
}
if (opt==)
{
scanf("%d",&x); /*x^=lastans;*/
CT[].Root[i]=CT[].Root[x];
CT[].Root[i]=CT[].Root[x];
}
if (opt==)
{
CT[].Root[i]=CT[].Root[i-];
CT[].Root[i]=CT[].Root[i-];
scanf("%d%d",&x,&y);
/*x^=lastans; y^=lastans;*/
int fx=Find(x,i),fy=Find(y,i);
if (fx==fy) puts("")/*, lastans=1*/;
else puts("")/*, lastans=0*/;
}
}
}
BZOJ3673/3674:可持久化并查集的更多相关文章
- [BZOJ3673&3674]可持久化并查集&加强版
题目大意:让你实现一个可持久化的并查集(3674强制在线). 解题思路:刚刚介绍了一个叫rope的神器:我是刘邦,在这两题(实际上两题没什么区别)就派上用场了. 正解应该是主席树||可持久化平衡树,然 ...
- [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 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:…… ...
- [bzoj] 3673 3674 可持久化并查集 || 可持久化数组
原题 加强版 题意: 可持久化并查集模板-- 题解: 用可持久化线段树维护一个可持久化数组,来记录每一次操作后的状态. 不能用路径压缩,但是要按置合并,使复杂度保证在O(log) #include&l ...
随机推荐
- Spring基础(4) : bean重写
@Configuration public class Config1 { @Bean() public Person getP(){ Person p = new Person(); p.setNa ...
- iphone safari浏览器CSS兼容性的解决方案集合
1.iphone safari不兼容CSS的active的解决方案如下: <body ontouchstart="" onmouseover=""> ...
- .NET世界的包管理器——Nuget
NugetServer 使用指南 为什么要使用Nuget 在我们的项目, 存在着一些公共Dll, 这些Dll被大量的项目所引用.同时这些公共dll也同时在进行版本升级, 由于缺乏版本管理,这些Dll会 ...
- Gold Rush(hnu13249)
Gold Rush Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:65536KB Total submit users: 15 ...
- HDU3829(KB10-J 二分图最大独立集)
Cat VS Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total ...
- vue实现倒计时的插件 时间戳 刷新 跳转 都不影响
工作当中需要开发一个倒计时插件,于是开始网上先拿来主义,发现好多倒计时的插件,刷新都会变成从头再来,于是自己用vue2.0写了一个插件,测试已经通过,直接上代码 如下是组件代码: <templa ...
- kotlin-2(IdeaIU-2018.2汉化破解)
1.下载文件包: 链接:https://pan.baidu.com/s/1AaAqkJ5E88k69dhcDiC0tA 提取码:b5uk 2.点击ideaIU-2018.2安装软件,安装完成后,不要点 ...
- cmd--登录mysql
cmd,Windows 命令提示符(cmd.exe)是 Windows NT 下的一个用于运行 Windows 控制面板程序或某些 DOS 程序的shell程序:或在 Windows CE 下只用于运 ...
- OSGI企业应用开发(七)细说Blueprint & Gemini Blueprint(二)
上篇文章介绍了标准的Blueprint 规范与 Gemini Blueprint如何自定义Bean配置文件路径,本文接着上篇文章继续介绍Blueprint的使用. 一.Bean的配置 前面提到过,Ge ...
- 如何在Vue中建立全局引用或者全局命令
1 一般在vue中,有很多vue组件,这些组件每个都是一个文件.都可能需要引用到相同模块(或者插件).我们不想每个文件都import 一次模块. 如果是基于vue.js编写的插件我们可以用 Vue.u ...