BZOJ 3674 主席树+并查集
来源:互联网 发布:dnspod 阿里云 编辑:程序博客网 时间:2024/05/17 23:44
/* BZOJ 3674: 可持久化并查集加强版 主席树+并查集*/#include <cstdio>#include <algorithm>#define m (l+r)/2using namespace std;const int N = 200100;const int M = N * 60;int n,q,tot;int fa[M],dp[M],T[N*4],lson[M],rson[M];int init(int l,int r){ int root=tot++; if(l==r)fa[root]=l,dp[root]=0; else lson[root]=init(l,m),rson[root]=init(m+1,r); return root;}int read(){ int x=0;char ch=getchar(); while(ch>'9'||ch<'0')ch=getchar(); while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x;}int upd(int root,int pos,int val,int tag){//printf("%d%d%d\n",tag,pos,val); int l=1,r=n,ret=tot++,cur=ret; while(r>l){ if(pos<=m){ r=m; rson[cur]=rson[root]; cur=lson[cur]=tot++; root=lson[root]; } else{ l=m+1; lson[cur]=lson[root]; cur=rson[cur]=tot++; root=rson[root]; } } fa[cur]=fa[root];dp[cur]=dp[root]; if(tag==0)fa[cur]=val; else dp[cur]=val; return ret;}int get(int root,int pos,int tag){ int l=1,r=n; while(r>l){ if(pos<=m)r=m,root=lson[root]; else l=m+1,root=rson[root]; } if(tag)return dp[root]; return fa[root];}int get_fa(int root,int pos){ int tmp=pos; while((tmp=get(root,tmp,0))!=pos)pos=tmp; return tmp;}int main(){ while(~scanf("%d%d",&n,&q)) { tot=0; T[0]=init(1,n); int ans=0; for(int i=1;i<=q;i++){ int p,a,b; //b=1; p=read();a=read(); if(p==2){ a^=ans; T[i]=T[a]; } if(p==1){ b=read(); a^=ans;b^=ans; T[i]=T[i-1]; int fa=get_fa(T[i],a),fb=get_fa(T[i],b); if(fa!=fb){ int dpa=get(T[i],fa,1),dpb=get(T[i],fb,1); if(dpa<dpb)swap(dpa,dpb),swap(fa,fb); T[i]=upd(T[i],fb,fa,0); if(dpa==dpb)T[i]=upd(T[i],fa,dpa+1,1); } } if(p==3){ b=read(); a^=ans;b^=ans; T[i]=T[i-1]; ans=(get_fa(T[i],a)==get_fa(T[i],b)); printf("%d\n",ans); } } }}
0 0
- BZOJ 3674 主席树+并查集
- [BZOJ] 3674 可持久化并查集加强版(主席树广泛运用)
- [主席树] BZOJ 3673 可持久化并查集 by zky BZOJ 3674 可持久化并查集加强版
- BZOJ 3673: 可持久化并查集 by zky&&3674: 可持久化并查集加强版|主席树
- bzoj 3545: [ONTAK2010]Peaks(离线处理+并查集+主席树)
- bzoj 3123: [Sdoi2013]森林 (主席树+启发式合并+并查集)
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
- 【HNOI 2012】永无乡 并查集+主席树
- bzoj3674 可持久化并查集加强版 (主席树 & 并查集)
- BZOJ 3211 线段树+并查集
- BZOJ 3674/BZOJ 3673 主席树
- BZOJ 1202 并查集
- BZOJ 1015 并查集
- BZOJ 1854 并查集
- BZOJ 1015 并查集
- bzoj 1529 并查集
- BZOJ 1116 并查集
- bzoj 1116 并查集
- Android 管理Log日志
- U_boot 的 bootcmd 和bootargs参数详解
- 培养职业素质
- ajax同步提交
- 【二十四】记录
- BZOJ 3674 主席树+并查集
- 动态库与静态库
- 【Android开发笔记】viewpager+fragment对adapter的选择
- 黑马程序员-java基础-代码块
- .gitignorer如何过滤提交的文件
- IDE常用快捷键
- Implement strStr() (C,C++,Java,Python)
- 使用 GCD 的 dispatch queue 实现同步锁
- hdu3006状态dp