求
查看原帖
求
800499
suzhikz楼主2024/5/14 20:26
#include<bits/stdc++.h>
using namespace std;
struct node{
	int data,value,cnt,left,right,siz;
}z[100005];
int tot,root;
void up(int x){
	z[x].siz=z[z[x].left].siz+z[z[x].right].siz+z[x].cnt;
}
void l_rotate(int &x){
	int tmp=z[x].right;
	z[x].right=z[tmp].left;
	z[tmp].left=x;
	z[tmp].siz=z[x].siz;
	up(x);
	x=tmp;
}
void r_rotate(int &x){
	int tmp=z[x].left;
	z[x].left=z[tmp].cnt;
	z[tmp].right=x;
	z[tmp].siz=z[x].siz;
	up(x);
	x=tmp;
}
void insert(int &x,int data){
	if(x==0){
		x=++tot;
		z[tot].data=data;
		z[tot].siz=1;
		z[tot].cnt=1;
		z[tot].value=rand();
	}
	if(data==z[x].data){
		z[x].cnt++;
	}else if(data>z[x].data){
		insert(z[x].right,data);
	}else{
		insert(z[x].left,data);
	}
	if(z[x].left&&z[z[x].left].value<z[x].value){
		r_rotate(x);
	}
	if(z[x].right&&z[z[x].right].value<z[x].value){
		l_rotate(x);
	}
	up(x);
}
void remove(int &x,int data){
	if(!x){
		return ;
	}
	if(z[x].data==data){
		z[x].cnt--;
		if(z[x].cnt){
			up(x);
			return;
		}
		if(z[x].left==0||z[x].right==0){
			x=z[x].left+z[x].right;
		}else{
			if(z[z[x].left].value<z[z[x].right].value){
				r_rotate(x);
				remove(z[x].right,data);
			}else{
				l_rotate(x);
				remove(z[x].left,data);
			}
		}
	}else if(z[x].data>data){
		remove(z[x].left,data);
	}else{
		remove(z[x].right,data);
	}
	up(x);
}
int ran(int x,int data){
	if(!x)return 1;
	int re=0;
	if(z[x].data>data){
		re+=ran(z[x].left,data);
	}else if(z[x].data==data){
		re=z[z[x].left].siz+z[x].cnt;
	}else{
		re=z[z[x].left].siz+z[x].cnt;
		re+=ran(z[x].right,data);
	}
	return re;
}
int get_data(int x,int rank){
	if(x==0)return 0; 
	if(rank<=z[z[x].left].siz){
		return get_data(z[x].left,rank);
	}else if(rank<=z[z[x].left].siz+z[x].cnt){
		return z[x].data;
	}else{
		return get_data(z[x].right,rank-z[x].cnt-z[z[x].left].siz);
	}
}
int get_pre(int data){
	int x=root;
	int pre;
	while(x){
		if(z[x].data>=data)x=z[x].left;
		else {
			pre=z[x].data;
			x=z[x].right;
		}
	}
	return pre;
}
int get_next(int data){
	int x=root;
	int next;
	while(x){
		if(z[x].data<=data){
			x=z[x].right;
		}else{
			next=z[x].data;
			x=z[x].left;
		}
	}
    return next;
}
int t;
int a,b,c,d;
int main(){
	srand(time(0));
	cin>>t;
	while(t--){
		cin>>a;
		if(a==1){
			cin>>b;
			insert(root,b);
		}else if(a==2){
			cin>>b;
			remove(root,b);
		}else if(a==3){
			cin>>b;
			cout<<ran(root,b);puts("");
		}else if(a==4){
			cin>>b;
			cout<<get_data(root,b);puts("");
		}else if(a==5){
			cin>>b;cout<<get_pre(b);puts("");
		}else if(a==6){
			cin>>b;
			cout<<get_next(b);puts("");
		}
	}
	
	
	return 0;
}
2024/5/14 20:26
加载中...