splayT了求助
查看原帖
splayT了求助
630240
VegeBeany楼主2023/1/12 15:33

rt,应该是死循环。
代码可能有点傻逼:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int rt=0,tot=0;
int cnt[N]={0},son[N][2]={0},val[N]={0},size[N]={0},f[N]={0};
struct Splay{
    inline void New(int x,int f){
    	val[++tot]=x;
    	cnt[tot]=size[tot]=1;
    	::f[tot]=f;
    	son[f][val[f]<x]=tot;
    	return ;
	}
    inline void update(int x){
    	size[x]=size[son[x][0]]+size[son[x][1]]+cnt[x];
    	return ;
	}
	inline int get(int x){
		return x==son[f[x]][1];
	}
	inline void clear(int x){
		son[x][0]=son[x][1]=f[x]=val[x]=size[x]=cnt[x]=0;
	}
	inline void rotate(int x){
		int y=f[x],z=f[y],s=get(x);
		son[y][s]=son[x][s^1];
		if(son[x][s^1])f[son[x][s^1]]=y;
		son[x][s^1]=y;
		f[y]=x;f[x]=z;
		if(z)son[z][y==son[z][1]]=x;
		update(x),update(y);
	}
	inline void splay(int x){
		for(int fa=f[x];fa=f[x],fa;rotate(x))
			if(f[fa])rotate(get(x)==get(fa)?fa:x);
		rt=x;
	}
	inline void insert(int x){
		if(!rt){
			New(x,0);
			rt=tot;
			return;
		}
		int p=rt,f=0;
		while(1){
			if(val[p]==x){
				cnt[p]++;
				update(f),update(p);
				splay(p);
				return ;
			}
			f=p;
			p=son[p][val[p]<x];
			if(!p){
				New(x,f);
				update(tot),update(f);
				splay(tot);
				return ;
			}
		}
	}
	inline int getrk(int x){
		int res=0,p=rt;
		while(1){
			if(x<val[p]){
				p=son[p][0];
			}else{
				res+=size[son[p][0]];
				if(x==val[p]){
					splay(p);
					return res+1;
				}
				res+=cnt[p];
				p=son[p][1];
			}
		}
	}
	inline int getval(int x){
		int p=rt;
		while(1){
			if(son[p][0]&&x<=size[son[p][0]]){
				p=son[p][0];
			}else{
				x-=cnt[p]+size[son[p][0]];
				if(x<=0){
					splay(p);
					return val[p]; 
				}
				p=son[p][1];
			}
		}
	}
	inline int getpre_(){
		int p=son[rt][0];
		if(!p)return p;
		while(son[p][1])p=son[p][1];
		splay(p);
		return p;
	}
	inline int getnxt_(){
		int p=son[rt][1];
		if(!p)return p;
		while(son[p][0])p=son[p][0];
		splay(p);
		return p;
	}
	inline void dele(int x){
		getrk(x);
		if(cnt[rt]>1){
			cnt[rt]--;
			update(rt);
			return;
		}
		if(!son[rt][0]&&!son[rt][1]){
			clear(rt);
			rt=0;
			return;
		}
		if(!son[rt][0]){
			int p=rt;
			rt=son[rt][1];
			f[rt]=0;
			clear(p);
			return;
		}
		if(!son[rt][1]){
			int p=rt;
			rt=son[rt][0];
			f[rt]=0;
			clear(p);
			return;
		}
		int p=rt;
		int k=getpre_();
		f[son[p][1]]=k;
		son[k][1]=son[p][1];
		clear(p);
		update(rt);
	}
	inline int getnxt(int x){
		insert(x);
		int k=getnxt_();
		dele(x);
		return val[k];
	}
	inline int getpre(int x){
		insert(x);
		int k=getpre_();
		dele(x);
		return val[k];
	}
}a;
int main(){
    int n;
    cin>>n;
    while(n--){
    	int opt,x;
    	cin>>opt>>x;
    	if(opt==1)a.insert(x);
    	if(opt==2)a.dele(x);
    	if(opt==3)cout<<a.getrk(x)<<endl;
    	if(opt==4)cout<<a.getval(x)<<endl;
    	if(opt==5)cout<<a.getpre(x)<<endl;
    	if(opt==6)cout<<a.getnxt(x)<<endl;
	}
    return 0;
}
2023/1/12 15:33
加载中...