Splay居然会被卡
查看原帖
Splay居然会被卡
241838
microchip楼主2024/10/14 21:28

最后一个点T了( 我不理解

#include<iostream>
using namespace std;

struct node{
	int val;
	int cnt,siz;
	int left,right,fa;
}T[1000050];

int n,op,x,root,nth;

void update(int no){
	T[no].siz=T[no].cnt+T[T[no].left].siz+T[T[no].right].siz;
}

bool son(int no){
	return T[T[no].fa].right==no;
}

void rotate(int no){
	int tmp=T[no].fa,tmp2=T[tmp].fa;
	bool flag=son(tmp);
	if(son(no)==0)
		T[tmp].left=T[no].right,T[T[no].right].fa=tmp,
		T[no].right=tmp,T[tmp].fa=no;
	else
		T[tmp].right=T[no].left,T[T[no].left].fa=tmp,
		T[no].left=tmp,T[tmp].fa=no;
	T[no].fa=tmp2;
	update(tmp);
	update(no);
	if(tmp2==0)return;
	if(flag==0)T[tmp2].left=no;
	else T[tmp2].right=no;
}

void splay(int no,int target=0){
	while(T[no].fa!=target){
		if(T[T[no].fa].fa!=target&&son(no)==son(T[no].fa))rotate(T[no].fa);
		rotate(no);
	}
	if(target==0)root=no;
}

void insert(int &no,int val,int lst){
	if(no==0){
		no=++nth;
		T[no].val=val;
		T[no].fa=lst;
		T[no].siz=T[no].cnt=1;
		splay(no);
		return;
	}
	if(T[no].val==val){
		++T[no].siz;
		++T[no].cnt;
		splay(no);
		return;
	}
	if(T[no].val>val)insert(T[no].left,val,no);
	else insert(T[no].right,val,no);
}

int kth_num(int no,int rk){
	if(no==0)return 0;
	if(T[T[no].left].siz>=rk)return kth_num(T[no].left,rk);
	if(T[T[no].left].siz<rk&&T[T[no].left].siz+T[no].cnt>=rk){
		splay(no);
		return T[no].val;
	}
	return kth_num(T[no].right,rk-T[T[no].left].siz-T[no].cnt);
}

int pre_num(int no,int val){
	if(no==0)return -2147483647;
	if(T[no].val>=val)return pre_num(T[no].left,val);
	int ret1=T[no].val,ret2=pre_num(T[no].right,val);
	if(ret2>ret1)return ret2;
	splay(no);
	return ret1;
}

int nxt_num(int no,int val){
	if(no==0)return 2147483647;
	if(T[no].val<=val)return nxt_num(T[no].right,val);
	int ret1=T[no].val,ret2=nxt_num(T[no].left,val);
	if(ret2<ret1)return ret2;
	splay(no);
	return ret1;
}

int Rank(int val){
	pre_num(root,val);
	return T[root].cnt+T[T[root].left].siz;
}

void bl(int no){
	if(no==0)return;
	bl(T[no].left);
	for(int i=1;i<=T[no].cnt;i++)cout<<T[no].val<<" ";
	bl(T[no].right);
}

void del(int val){
	pre_num(root,val+1);
	if(T[root].cnt>1){
		--T[root].cnt;
		--T[root].siz;
		return;
	}
	int L=T[root].left,R=T[root].right;
	T[R].fa=0;
	root=R;
	kth_num(root,1);
	T[root].left=L;
	T[L].fa=root;
}

int main()
{
	cin>>n;
	insert(root,-2147483647,0);
	insert(root,2147483647,0);
	while(n--){
		cin>>op>>x;
		switch(op){
			case 1:{
				insert(root,x,0);
				break;
			}
			case 2:{
				del(x);
				break;
			}
			case 3:{
				cout<<Rank(x)<<endl;
				break;
			}
			case 4:{
				cout<<kth_num(root,x+1)<<endl;
				break;
			}
			case 5:{
				cout<<pre_num(root,x)<<endl;
				break;
			}
			case 6:{
				cout<<nxt_num(root,x)<<endl;
				break;
			}
		}
	}
	return 0;
}

2024/10/14 21:28
加载中...