[bzoj3673] 可持久化并查集 by zky
总感觉到现在才来写这题有点奇怪。
并查集如果按秩合并的话,每次合并只会修改一个点的父亲。
用可持久化线段树来实现可持久化数组就行了。。
然而我写的是按子树大小合并。。结果比按秩合并慢了一点>_<
中途因为没看清楚 “回到第k次操作之后的状态” WA了好几发= =
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=;
const int mxnode=maxn*;
int lc[mxnode],rc[mxnode],sz[mxnode],num[mxnode],fa[mxnode],rt[maxn];
int i,j,k,n,m,tot,x,y; int ra;char rx;
inline int read(){
rx=getchar(),ra=;
while(rx<''||rx>'')rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra;
}
inline int getpos(int x){
int p,a,b,mid;
p=rt[i-],a=,b=n;
while(a<b){
mid=(a+b)>>;
if(x<=mid)p=lc[p],b=mid;
else p=rc[p],a=mid+;
}
return p;
}
inline void upd(int pre,int &x,int a,int b,int pos,int v){
x=++tot;
if(a==b){num[x]=pos,fa[x]=v,sz[x]=sz[pre];return;}
int mid=(a+b)>>;
if(pos<=mid)rc[x]=rc[pre],upd(lc[pre],lc[x],a,mid,pos,v);
else lc[x]=lc[pre],upd(rc[pre],rc[x],mid+,b,pos,v);
}
inline void uni(int x,int y){
for(x=getpos(x);num[x]!=fa[x];x=getpos(fa[x]));
for(y=getpos(y);num[y]!=fa[y];y=getpos(fa[y]));
if(x==y){rt[i]=rt[i-];return;}
if(sz[x]<sz[y])
upd(rt[i-],rt[i],,n,num[x],num[y]),sz[y]+=sz[x];
else upd(rt[i-],rt[i],,n,num[y],num[x]),sz[x]+=sz[y];
}
void build(int &x,int a,int b){
x=++tot;
if(a==b){sz[x]=,num[x]=fa[x]=a;return;}
build(lc[x],a,(a+b)>>),build(rc[x],((a+b)>>)+,b);
} int main(){
n=read(),m=read();
build(rt[],,n);int id;
for(i=;i<=m;i++){
id=read();//printf("now: %d\n",now);
if(id==)rt[i]=rt[read()];
if(id==)x=read(),y=read(),uni(x,y);
if(id==){
x=read(),y=read();
for(x=getpos(x);num[x]!=fa[x];x=getpos(fa[x]));
for(y=getpos(y);num[y]!=fa[y];y=getpos(fa[y]));
printf("%d\n",x==y);
rt[i]=rt[i-];
}
}
return ;
}
[bzoj3673] 可持久化并查集 by zky的更多相关文章
- BZOJ3673 可持久化并查集 by zky 【主席树】
BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...
- bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...
- [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)
Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...
- [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky
思路: 用主席树维护并查集森林,每次连接时新增结点. 似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直 ...
- BZOJ3673 可持久化并查集 by zky 可持久化 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3673 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...
- bzoj3673: 可持久化并查集 by zky&&3674: 可持久化并查集加强版
主席树可持久化数组,还挺好YY的 然而加强版要路径压缩.. 发现压了都RE 结果看了看数据,默默的把让fx的父亲变成fy反过来让fy的父亲变成fx 搞笑啊 #include<cstdio> ...
- 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树
没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...
- 3673: 可持久化并查集 by zky
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 2170 Solved: 978[Submit][Status ...
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集 ...
随机推荐
- Swift3.0 自定义tableView复用cell 的写法,与CollectionViewCell的不同,数据model
Model数据 class HospitalModel: NSObject { //后边不赋值 会报错 var imgurl :String = "" var introducti ...
- bzoj 2298: [HAOI2011]problem a
Description 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n ...
- js的Date对象
1.构造Date对象 var dt = new Date(); //获取当地包含日期和时间的对象,格式为:Thu Aug 31 2017 09:15:43 GMT+0800 (中国标准时间) 2.使用 ...
- JavaScript中的数组对象遍历、读写、排序等操作
以百度前端技术学院的js任务三为例,复习一下关于js数组的几个点 题目 <!DOCTYPE> <html> <head> <meta charset=&quo ...
- Neo4j学习笔记(1)——使用API编写一个Hello World程序
项目的创建及配置 因为Neo4j依赖的jar包比较多,所以推荐使用Maven来管理. 首先创建一个Maven Project,添加依赖: <dependency> <groupId& ...
- Automata
A deterministic finite automaton is represented formally by a 5-tuple (Q,Σ,δ,q0,F), where: Q is a fi ...
- mysql也有complex view merging 这个特性(5.6 , 5.7)
出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该声明. ...
- 关于recycleview 滑动item变长(item变形)问题
昨天在做项目的时候出现了bug,表现是在滑动的时候,整个item会被拉长了,松手后就回归正常大小了, 出现这个的主要原因是因为你的item布局中最大的那个根布局是 match_parent状态,因此导 ...
- 导出生成xsl文件
public String expData() throws Exception{ List<SubArea> list = subAreaService.fin ...
- 树上操作[HAOI 2015]
树链剖分裸题: 树剖点这里:传送门 代码: #include<bits/stdc++.h> #define sight(c) ('0'<=c&&c<='9') ...