splay码风优良求调
查看原帖
splay码风优良求调
322437
xxxalq楼主2024/4/21 21:56
#include<bits/stdc++.h>
using namespace std;
const int inf=1e9+7;
int read(){
	int x=0;
	bool flag=false;
	char ch=getchar();
	while(ch>57||ch<48){
		if(ch=='-'){
			flag=true;
		}
		ch=getchar();
	}
	while(ch>=48&&ch<=57){
		x=(x<<1)+(x<<3)+(ch-48);
		ch=getchar();
	}
	return flag?-x:x;
}
int idx,m,root;
struct node{
	int ls,rs,cnt,size,fa,val;
}tr[100003]; 
void pushup(int u){
	tr[u].size=tr[tr[u].ls].size+tr[tr[u].rs].size+tr[u].cnt;
	return;
}
void rotate(int u){
	int v=tr[tr[u].fa].fa;
	tr[u].fa=v;
	bool flag=(tr[tr[u].fa].ls==u);
	if(tr[v].rs==tr[u].fa){
		tr[v].rs=u;
	}else{
		tr[v].ls=u;
	}
	tr[u].fa=v;
	if(flag){
		tr[tr[u].fa].ls=tr[u].rs;
	}else{
		tr[tr[u].fa].rs=tr[u].ls;
	}
	pushup(tr[u].fa),pushup(u);
	return;
}
void splay(int u,int t){
	while(tr[u].fa!=t){
		int v=tr[tr[u].fa].fa;
		if(v!=t){
			if((tr[v].ls==tr[u].fa)^(tr[tr[u].fa].ls==u)){
				rotate(tr[u].fa);
			}
		}
		rotate(u);
	}
	if(t==0){
		root=u;
	}
	return;
}
void find(int x){
	int u=root;
	while(tr[u].val!=x){
		if(x<tr[u].val&&tr[u].ls){
			u=tr[u].ls;
		}else if(x>tr[u].val&&tr[u].rs){
			u=tr[u].rs;
		}
	}
	splay(u,0);
	return;
}
void insert(int x){
	int p=0,u=root;
	while(u&&tr[u].val!=x){
		p=u;
		if(x<tr[u].val){
			u=tr[u].ls;
		}else{
			u=tr[u].rs;
		}
	}
	if(u){
		tr[u].cnt+=1;
	}else{
		u=++idx;
		if(p){
			if(x<tr[p].val){
				tr[p].ls=u;
			}else{
				tr[p].rs=u;
			}
			tr[u].val=x,tr[u].fa=p;
			tr[u].size=tr[u].cnt=1;
		}
	}
	splay(u,0);
	return;
}
int grank(int v){
	find(v);
	if(tr[root].val<v){
		return tr[tr[root].ls].size+tr[root].cnt;
	}
	return tr[tr[root].ls].size;
}
int gval(int x){
	int u=root;
	while(1){
		if(tr[tr[u].ls].size>=x){
			u=tr[u].ls;
		}else if(tr[tr[u].ls].size+tr[u].cnt>=x){
			break;
		}else{
			x-=tr[tr[u].ls].size+tr[u].cnt;
			u=tr[u].rs;
		}
	} 
	splay(u,0);
	return tr[u].val;
}
int gnxt(int x){
	find(x);
	if(tr[root].val>x){
		return root;
	}
	int u=tr[root].rs;
	while(tr[u].ls){
		u=tr[u].ls;
	}
	splay(u,0);
	return u;
}
int gpre(int x){
	find(x);
	if(tr[root].val<x){
		return root;
	}
	int u=tr[root].ls;
	while(tr[u].rs){
		u=tr[u].rs;
	}
	splay(u,0);
	return u;
}
void del(int x){
	int pre=gpre(x),nxt=gnxt(x);
	splay(pre,0);
	splay(nxt,pre);
	int u=tr[nxt].ls;
	if(tr[u].cnt>1){
		tr[u].cnt-=1;
		splay(u,0);
	}else{
		tr[nxt].ls=0;
		splay(nxt,0);
	}
	return;
}
int main(){
	int op,x;
	insert(inf);
	insert(-inf);
	m=read();
	while(m--){
		op=read();
		switch(op){
			case 1:insert(x);break;
			case 2:del(x);break;
			case 3:cout<<grank(x)<<"\n";break;
			case 4:cout<<gval(x)<<"\n";break;
			case 5:cout<<gpre(x)<<"\n";break;
			case 6:cout<<gnxt(x)<<"\n";break;
		}
	}
	return 0;
}
2024/4/21 21:56
加载中...