【bzoj3673】可持久化并查集 by zky
2017-05-27 21:17
260 查看
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
5 6
1 1 2
3 1 2
2 0
3 1 2
2 1
3 1 2
Sample Output
1
0
1
题解
对每一个时刻建立一颗可持久化线段树,维护信息。
代码
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
5 6
1 1 2
3 1 2
2 0
3 1 2
2 1
3 1 2
Sample Output
1
0
1
题解
对每一个时刻建立一颗可持久化线段树,维护信息。
代码
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,m,sz; int root[200005],ls[2000005],rs[2000005],v[2000005],deep[2000005]; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } void build(int &k,int l,int r) { k=++sz; if (l==r){v[k]=l;return;} int mid=(l+r)>>1; build(ls[k],l,mid);build(rs[k],mid+1,r); } void modify(int l,int r,int x,int &y,int pos,int val) { y=++sz; if (l==r){v[y]=val;deep[y]=deep[x];return;} ls[y]=ls[x];rs[y]=rs[x]; int mid=(l+r)>>1; if (pos<=mid) modify(l,mid,ls[x],ls[y],pos,val); else modify(mid+1,r,rs[x],rs[y],pos,val); } int query(int k,int l,int r,int pos) { if (l==r) return k; int mid=(l+r)>>1; if (pos<=mid) return query(ls[k],l,mid,pos); else return query(rs[k],mid+1,r,pos); } void add(int k,int l,int r,int pos) { if (l==r){deep[k]++;return;} int mid=(l+r)>>1; if(pos<=mid)add(ls[k],l,mid,pos); else add(rs[k],mid+1,r,pos); } int find(int k,int x) { int p=query(k,1,n,x); if (x==v[p]) return p; return find(k,v[p]); } int main() { n=read();m=read(); build(root[0],1,n); int opt,k,a,b; for (int i=1;i<=m;i++) { opt=read(); if (opt==1) { root[i]=root[i-1]; a=read(),b=read(); int p=find(root[i],a),q=find(root[i],b); if (v[p]==v[q]) continue; if (deep[p]>deep[q]) swap(p,q); modify(1,n,root[i-1],root[i],v[p],v[q]); if(deep[p]==deep[q])add(root[i],1,n,v[q]); } else if (opt==2) { k=read();root[i]=root[k]; } else { root[i]=root[i-1]; a=read();b=read(); int p=find(root[i],a),q=find(root[i],b); if (v[p]==v[q]) puts("1"); else puts("0"); } } return 0; }
相关文章推荐
- BZOJ 3673: 可持久化并查集 by zky
- BZOJ 3673/3674 可持久化并查集 by zky [rope可持久化平衡树]
- BZOJ 3674: 可持久化并查集加强版/BZOJ 3673: 可持久化并查集 by zky 可持久化线段树
- 【BZOJ3673】【可持久化并查集】可持久化并查集 by zky
- BZOJ 3673 可持久化并查集 by zky 可持久化并查集
- 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
- BZOJ 3673/3674(可持久化并查集 by zky,可持久化并查集加强版-可持久化数组)
- [BZOJ3673]可持久化并查集 by zky-主席树
- BZOJ3673 可持久化并查集 by zky
- 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树
- bzoj 3673: 可持久化并查集 by zky
- bzoj3673: 可持久化并查集 by zky
- 【BZOJ】3673: 可持久化并查集 by zky
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
- 【可持久化数组】【rope】bzoj3673 bzoj3674 可持久化并查集 by zky