bzoj 3674: 可持久化并查集加强版 可持久化线段树
2016-12-21 17:20
337 查看
题意
n个集合 m个操作操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0
请注意本题采用强制在线,所给的a,b,k均经过加密,加密方法为x = x xor lastans,lastans的初始值为0
0
分析
用可持久化线段树维护fa数组即可。并查集不能路径压缩要按秩合并。
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define N 200005 using namespace std; int n,m,tot,root ,size ,now; struct tree{int l,r,fa;}t[N*100]; void build(int &d,int l,int r) { d=++tot; if (l==r) { t[d].fa=l; return; } int mid=(l+r)/2; build(t[d].l,l,mid);build(t[d].r,mid+1,r); } int find(int d,int l,int r,int x) { if (l==r) if (t[d].fa==l) return l; else return find(root[now],1,n,t[d].fa); int mid=(l+r)/2; if (x<=mid) return find(t[d].l,l,mid,x); else return find(t[d].r,mid+1,r,x); } void modify(int &d,int p,int l,int r,int x,int y) { d=++tot; t[d].l=t[p].l;t[d].r=t[p].r; if (l==r) { t[d].fa=y; return; } int mid=(l+r)/2; if (x<=mid) modify(t[d].l,t[p].l,l,mid,x,y); else modify(t[d].r,t[p].r,mid+1,r,x,y); } int main() { //freopen("3673.in","r",stdin); //freopen("test.out","w",stdout); scanf("%d%d",&n,&m); build(root[0],1,n); int last=0; for (int i=1;i<=m;i++) { now=i; int op; scanf("%d",&op); root[i]=root[i-1]; if (op==1) { int x,y; scanf("%d%d",&x,&y); x^=last;y^=last; int w=find(root[i],1,n,y),u=find(root[i],1,n,x); if (w==u) continue; if (size[w]>size[u]) swap(w,u); size[u]+=size[w]; modify(root[i],root[i-1],1,n,w,u); } else if (op==2) { int x; scanf("%d",&x); x^=last; root[i]=root[x]; } else { int x,y; scanf("%d%d",&x,&y); x^=last;y^=last; if (find(root[i],1,n,x)==find(root[i],1,n,y)) last=1; else last=0; printf("%d\n",last); } } return 0; }
相关文章推荐
- bzoj3674 可持久化并查集加强版 可持久化线段树
- BZOJ 3674: 可持久化并查集加强版/BZOJ 3673: 可持久化并查集 by zky 可持久化线段树
- 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之
- 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树
- BZOJ 3674 可持久化并查集加强版 可持久化线段树
- 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)
- [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky
- [BZOJ3674]可持久化并查集加强版(可持久化线段树+并查集)
- BZOJ 3674 可持久化并查集加强版 可持久化并查集
- BZOJ 3674: 可持久化并查集加强版 可持久化并查集
- 【可持久化并查集】BZOJ3674[可持久化并查集加强版]题解
- 【BZOJ】【3673】可持久化并查集 & 【3674】可持久化并查集加强版
- BZOJ 3674 可持久化并查集加强版 可持久化并查集
- BZOJ 3673: 可持久化并查集 by zky&&3674: 可持久化并查集加强版|主席树
- BZOJ 3673/3674(可持久化并查集 by zky,可持久化并查集加强版-可持久化数组)
- 3674: 可持久化并查集加强版 可持久化线段树
- [BZOJ 3674]可持久化并查集加强版:可持久化并查集
- BZOJ 3673 可持久化并查集 by zky && 3674 可持久化并查集加强版
- 3674: 可持久化并查集加强版 (可持久化线段树)
- [主席树] BZOJ 3673 可持久化并查集 by zky BZOJ 3674 可持久化并查集加强版