bzoj 3673: 可持久化并查集 by zky
2017-12-01 20:03
169 查看
→题目链接←
【想说的话】
rope大法好!!!!!
【题解】
用rope来实现可持久化并查集
rp[i]->at(x) 访问下标为x的元素的值
rp[i]->replace(pos,x) 将下标为pos的元素的值更改为x
rp[i]=new rope<int>(*rp[y]) 将rp[y]整个复制到rp[i]
【代码】
#include<bits/stdc++.h>
#include<ext/rope>
#define MAXN 20020
using namespace std;
using namespace __gnu_cxx;
inline int rd(){
int x=0,y=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*y;
}
int n,m;
rope<int> *rp[MAXN];
int a[MAXN];
inline int fa(int i,int x){
return rp[i]->at(x);
}
int getroot(int i,int x){
if(fa(i,x)==x)return x;
rp[i]->replace(x,getroot(i,fa(i,x)));
return fa(i,x);
}
inline void un(int i,int x,int y){
x=getroot(i,x);
y=getroot(i,y);
if(x==y)return;
rp[i]->replace(x,y);
}
int main(){
n=rd(),m=rd();
for(int i=1; i<=n; i++)a[i]=i;
rp[0]=new rope<int>(a,a+n+1);
int i=0;
while(m--){
i++;
rp[i]=new rope<int>(*rp[i-1]);
int x=rd(),y,z;
if(x==1)y=rd(),z=rd(),un(i,y,z);
else if(x==2)y=rd(),rp[i]=new rope<int>(*rp[y]);
else y=rd(),z=rd(),printf("%d\n",getroot(i,y)==getroot(i,z));
}
return 0;
}
【想说的话】
rope大法好!!!!!
【题解】
用rope来实现可持久化并查集
rp[i]->at(x) 访问下标为x的元素的值
rp[i]->replace(pos,x) 将下标为pos的元素的值更改为x
rp[i]=new rope<int>(*rp[y]) 将rp[y]整个复制到rp[i]
【代码】
#include<bits/stdc++.h>
#include<ext/rope>
#define MAXN 20020
using namespace std;
using namespace __gnu_cxx;
inline int rd(){
int x=0,y=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*y;
}
int n,m;
rope<int> *rp[MAXN];
int a[MAXN];
inline int fa(int i,int x){
return rp[i]->at(x);
}
int getroot(int i,int x){
if(fa(i,x)==x)return x;
rp[i]->replace(x,getroot(i,fa(i,x)));
return fa(i,x);
}
inline void un(int i,int x,int y){
x=getroot(i,x);
y=getroot(i,y);
if(x==y)return;
rp[i]->replace(x,y);
}
int main(){
n=rd(),m=rd();
for(int i=1; i<=n; i++)a[i]=i;
rp[0]=new rope<int>(a,a+n+1);
int i=0;
while(m--){
i++;
rp[i]=new rope<int>(*rp[i-1]);
int x=rd(),y,z;
if(x==1)y=rd(),z=rd(),un(i,y,z);
else if(x==2)y=rd(),rp[i]=new rope<int>(*rp[y]);
else y=rd(),z=rd(),printf("%d\n",getroot(i,y)==getroot(i,z));
}
return 0;
}
相关文章推荐
- BZOJ 3673 可持久化并查集 by zky
- bzoj 3673: 可持久化并查集 by zky
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
- BZOJ 3674: 可持久化并查集加强版/BZOJ 3673: 可持久化并查集 by zky 可持久化线段树
- bzoj 3673: 可持久化并查集 by zky
- 【BZOJ】3673: 可持久化并查集 by zky
- bzoj3673 可持久化并查集by zky
- 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之
- BZOJ 3673: 可持久化并查集 by zky
- [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)
- 【可持久化并查集】BZOJ3673-可持久化并查集 by zky
- BZOJ 3673: 可持久化并查集 by zky
- BZOJ 3673: 可持久化并查集 by zky
- bzoj3673: 可持久化并查集 by zky
- BZOJ3673 可持久化并查集 by zky
- BZOJ 3673/3674(可持久化并查集 by zky,可持久化并查集加强版-可持久化数组)
- BZOJ 3673 / 3674 可持久化并查集 by zky [主席树]
- 【BZOJ3673】【可持久化并查集】可持久化并查集 by zky
- [BZOJ3673]可持久化并查集 by zky-主席树
- 【可持久化数组】【rope】bzoj3673 bzoj3674 可持久化并查集 by zky