【CSDN网盘系列】splay模板

调了半天终于第一次调出splay呀!

#include<cstdio>
#include<algorithm>
using namespace std;
struct node {
    
    
	int l,r,fa,cnt,size,v;
}f[100005];
int tot,rt,n,x,t;
void maintain(int x) {
    
    f[x].size=f[f[x].l].size+f[f[x].r].size+f[x].cnt;}
void clean(int x) {
    
    f[x].size=f[x].cnt=f[x].l=f[x].r=f[x].v=f[x].fa=0;}
void xuan(int x) {
    
    
	int y=f[x].fa,z=f[y].fa;
	if (x==f[y].r) {
    
    f[y].r=f[x].l,f[f[x].l].fa=y,f[x].l=y,f[y].fa=x,f[x].fa=z;}
	else if (x==f[y].l) {
    
    f[y].l=f[x].r,f[f[x].r].fa=y,f[x].r=y,f[y].fa=x,f[x].fa=z;}
	if (z) {
    
    if (y==f[z].l) f[z].l=x; if (y==f[z].r) f[z].r=x;}
	maintain(y),maintain(x);
}
void splay(int x) {
    
    
	for (int i=f[x].fa;i=f[x].fa,i;xuan(x))
		if (f[i].fa)
			if ((x==f[f[x].fa].l&&i==f[f[i].fa].l)||(x==f[f[x].fa].r&&i==f[f[i].fa].r)) xuan(i); else xuan(x);
	rt=x;
}
int qian() {
    
    int now=f[rt].l; while (f[now].r) now=f[now].r; splay(now); return now;}
int hou() {
    
    int now=f[rt].r; while (f[now].l) now=f[now].l; splay(now); return now;}
int rank(int x) {
    
    
	int now=rt,ans=0;
	while (1) {
    
    
		if (x<f[now].v) now=f[now].l;
		else if (x>f[now].v) ans+=f[f[now].l].size+f[now].cnt,now=f[now].r;
		else if (x==f[now].v) {
    
    ans+=f[f[now].l].size,splay(now); return ans+1;} 
	}
}
int th(int x) {
    
    
	int now=rt;
	while (1) {
    
    
		if (f[now].l&&x<=f[f[now].l].size) now=f[now].l;
		else {
    
    
			x-=(f[f[now].l].size+f[now].cnt);
			if (x<=0) {
    
    splay(now); return f[now].v;} now=f[now].r;}
	}
}
void ins(int x) {
    
    
	if (!rt) {
    
    rt=++tot,f[rt].v=x,f[rt].cnt++,maintain(rt); return;}
	int now=rt,p=0;
	while (1) {
    
    
		if (x==f[now].v) {
    
    f[now].cnt++,maintain(now),maintain(p),splay(now); break;}
		p=now; if (x>f[now].v) now=f[now].r; else now=f[now].l;
		if (!now) {
    
    
			f[++tot].v=x,f[tot].cnt++,f[tot].fa=p;
			if  (x>f[p].v) f[p].r=tot; else f[p].l=tot; maintain(tot),maintain(p),splay(tot); break;}
	}
}
void del(int x) {
    
    
	int r=rank(x);
	if (f[rt].cnt>1) {
    
    f[rt].cnt--,maintain(rt); return;}
	if (!f[rt].l&&!f[rt].r) {
    
    clean(rt),rt=0; return;}
	if (!f[rt].l) {
    
    int now=rt; rt=f[rt].r,f[rt].fa=0,clean(now); return;}
	if (!f[rt].r) {
    
    int now=rt; rt=f[rt].l,f[rt].fa=0,clean(now); return;}
	int now=rt,xx=qian(); f[f[now].r].fa=xx,f[xx].r=f[now].r,clean(now),maintain(rt);
}
int main() {
    
    
	scanf("%d",&n);
	while (n--) {
    
    
		scanf("%d%d",&t,&x); if (t==1) ins(x); if (t==2) del(x); if (t==3) printf("%d\n",rank(x)); if (t==4) printf("%d\n",th(x)); 
		if (t==5) ins(x),printf("%d\n",f[qian()].v),del(x); if (t==6) ins(x),printf("%d\n",f[hou()].v),del(x);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_49972640/article/details/113029928
今日推荐