您的位置:首页 > 其它

splay

2016-04-07 19:38 295 查看

 随便敲敲练手。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf=1e9;
const int maxn=200000;
int N,M,T,tot,root;
int key[maxn],lc[maxn],rc[maxn],fa[maxn],siz[maxn];
inline void update(int x){
siz[x]=siz[lc[x]]+siz[rc[x]]+1;
}
inline void r_rotate(int x){
int y=fa[x];
lc[y]=rc[x];
if(rc[x]) fa[rc[x]]=y;
fa[x]=fa[y];
if(y==lc[fa[y]]) lc[fa[y]]=x;
else rc[fa[y]]=x;
fa[y]=x; rc[x]=y;
update(y); update(x);
}
inline void l_rotate(int x){
int y=fa[x];
rc[y]=lc[x];
if(lc[x]) fa[lc[x]]=y;
fa[x]=fa[y];
if(y==lc[fa[y]]) lc[fa[y]]=x;
else rc[fa[y]]=x;
fa[y]=x; lc[x]=y;
update(y); update(x);
}
inline void splay(int x,int s){
int p;
while(fa[x]!=s){
int p=fa[x];
if(fa

==s){ if(x==lc[p]) r_rotate(x); else l_rotate(x); break; } else if(x==lc[p]){ if(p==lc[fa[p]]) r_rotate(x),r_rotate(x); else r_rotate(x),l_rotate(x); } else if(x==rc[p]){ if(p==rc[fa[p]]) l_rotate(x),l_rotate(x); else l_rotate(x),r_rotate(x); } } if(s==0) root=x; } inline void insert(int v){ if(root==0){ root=++tot; rc[0]=tot; key[root]=v; siz[root]=1; return ; } int tmp,x=root; while(x!=0){ tmp=x; if(v<=key[x]) siz[x]++,x=lc[x]; else siz[x]++,x=rc[x]; } if(v<=key[tmp]){ lc[tmp]=++tot; fa[tot]=tmp; key[tot]=v; siz[tot]=1; } else{ rc[tmp]=++tot; fa[tot]=tmp; key[tot]=v; siz[tot]=1; } splay(tot,0); } inline int find(int v){ int x=root; while(x!=0){ if(v<key[x]) x=lc[x]; else if(v>key[x]) x=rc[x]; else{ splay(x,0); return x; } } return -1; } inline int getmax(int x){ int tmp; while(x!=0){ tmp=x; x=rc[x]; } return tmp; } inline int getmin(int x){ int tmp; while(x!=0){ tmp=x; x=lc[x]; } return tmp; } inline void Delete(int v){ int x=find(v); if(x==-1) return ; int pp=getmax(lc[x]),nn=getmin(rc[x]); if(lc[x]==0||rc[x]==0){ if(lc[x]==0&&rc[x]==0){ root=0; rc[0]=0; return ; } else if(lc[x]==0){ rc[0]=rc[x]; fa[rc[x]]=0; root=rc[x]; rc[x]=0; siz[x]=1; return ; } else{ rc[0]=lc[x]; fa[lc[x]]=0; root=lc[x]; lc[x]=0; siz[x]=1; return ; } } splay(pp,0); splay(nn,root); fa[lc[nn]]=0; siz[lc[nn]]=1; lc[nn]=0; update(nn); update(pp); } inline int rank(int x,int v){ if(x==0) return 1; if(v<=key[x]) return rank(lc[x],v); else return siz[lc[x]]+1+rank(rc[x],v); } inline int findkth(int x,int k){ if(siz[lc[x]]+1==k) return key[x]; if(siz[lc[x]]+1>k) return findkth(lc[x],k); return findkth(rc[x],k-siz[lc[x]]-1); } inline int pred(int rt,int v){ if(rt==0) return v; if(v<=key[rt]) return pred(lc[rt],v); else{ int ans=pred(rc[rt],v); if(ans==v) return key[rt]; return ans; } } inline int succ(int rt,int v){ if(rt==0) return v; if(v>=key[rt]) return succ(rc[rt],v); else{ int ans=succ(lc[rt],v); if(ans==v) return key[rt]; return ans; } } int main(){ freopen("3224.in","r",stdin); freopen("3224.out","w",stdout); scanf("%d",&T); while (T--){ int kin,num; scanf("%d%d",&kin,&num); if(kin==1) insert(num); else if(kin==2) Delete(num); else if(kin==3) printf("%d\n",rank(root,num)); else if(kin==4) printf("%d\n",findkth(root,num)); else if(kin==5) printf("%d\n",pred(root,num)); else if(kin==6) printf("%d\n",succ(root,num)); } return 0; }

[p] 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: