bzoj 2733 splay+启发式合并
来源:互联网 发布:mac怎么装千牛 编辑:程序博客网 时间:2024/06/05 01:54
一道水题,我们用splay+启发式合并(其实就是一个比较暴力的方法,把siz小的splay树里的点一个一个塞到大的splay树中)
最开始我想了半天怎么存root,后来发现我傻了,直接splay到根就好了。
这份代码里德root数组其实是并查集数组,不要在意细节- -。
下面是我AC代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define N 100005using namespace std;int n,m,c[N][2],val[N],fa[N],root[N],siz[N],a,b;void update(int x){ int l=c[x][0],r=c[x][1]; siz[x]=siz[l]+siz[r]+1;}void rotate(int x){ int y=fa[x],z=fa[y]; int l=(c[y][0]!=x),r=l^1; if(fa[y]){ if(c[z][0]==y) c[z][0]=x; else c[z][1]=x; } fa[x]=z,fa[y]=x,fa[c[x][r]]=y; c[y][l]=c[x][r],c[x][r]=y; update(y),update(x); } void splay(int x){ while(fa[x]){ int y=fa[x],z=fa[y]; if(fa[y]){ if(c[y][0]==x^c[z][0]==y)rotate(x); else rotate(y); } rotate(x); }}int insert(int x,int pos){ int l=c[x][0],r=c[x][1]; if(val[pos]>val[x]){ if(r)return insert(r,pos); else { c[pos][0]=c[pos][1]=0,siz[pos]=1,c[x][1]=pos,fa[pos]=x,update(x),splay(pos); return pos; } } else{ if(l)return insert(l,pos); else { c[pos][0]=c[pos][1]=0,siz[pos]=1,c[x][0]=pos,fa[pos]=x,update(x),splay(pos); return pos; } }}void merge(int x,int rt){ int l=c[x][0],r=c[x][1]; rt=insert(rt,x); if(l) merge(l,rt); if(r) merge(r,rt);}char s[2];int query(int x,int rk){ if(siz[x]<rk)return -1; int l=c[x][0],r=c[x][1]; if(siz[l]+1==rk)return x; if(siz[l]>=rk)return query(l,rk); return query(r,rk-siz[l]-1);}int find(int x){return x==root[x]?x:root[x]=find(root[x]);}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&val[i]); siz[i]=1;root[i]=i; } for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); int x=find(a),y=find(b); if(x==y)continue; else{ root[x]=y; splay(a),splay(b); if(siz[a]>siz[b])swap(a,b); merge(a,b); } } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%s%d%d",s,&a,&b); if(s[0]=='Q'){ splay(a); printf("%d\n",query(a,b)); }else{ int x=find(a),y=find(b); if(x==y)continue; root[x]=y; splay(a),splay(b); if(siz[a]>siz[b])swap(a,b); merge(a,b); } }}
阅读全文
0 0
- bzoj 2733(splay启发式合并)
- bzoj 2733 splay+启发式合并
- 【splay启发式合并】bzoj 2733 永无乡
- 【BZOJ 2733】 [HNOI2012]永无乡|Splay启发式合并
- bzoj 2733 永无乡 Splay 启发式合并
- bzoj 2733 [HNOI2012]永无乡 splay启发式合并
- bzoj 2733: [HNOI2012]永无乡(splay+启发式合并)
- BZOJ 2733 [HNOI2012] 永无乡 [splay+启发式合并做法]
- BZOJ 2809([Apio2012]dispatching-Splay启发式合并)
- BZOJ 3545: [ONTAK2010]Peaks|Splay启发式合并
- bzoj 3545: [ONTAK2010]Peaks (splay启发式合并)
- hdu 4680 splay,启发式合并
- BZOJ2733 永无乡 【splay启发式合并】
- BZOJ 2733 HNOI2012 永无乡 Treap+启发式合并
- 【BZOJ 2733】[HNOI2012]永无乡 启发式合并treap
- BZOJ 2733: [HNOI2012]永无乡 (Treap+启发式合并)
- BZOJ 2733([HNOI2012]永无乡-Treap启发式合并)
- bzoj 2733 永无乡 线段树启发式合并
- iOS UITextField输入手机号时自动添加空格
- 图片加载显示在listview上
- 编程点滴
- Redis探索之旅(2)- 在Windows下搭建单实例Redis服务器
- Android将list数据通过LitePal保存到本地(集合保存到本地)
- bzoj 2733 splay+启发式合并
- android 窗口式activity
- 倍增lca
- 找寻数组中重复的元素
- bootstrap基本显示页面
- 字符设备驱动(一)
- Redis探索之旅(3)- 在Windows下将Redis注册成本地服务
- codeforces 727E. Games on a CD(双Hash
- JAVABEAN EJB POJO区别