平衡树求助
查看原帖
平衡树求助
695750
_Punainen_楼主2023/11/12 20:20
#include<bits/stdc++.h>
using namespace std;
const int M=1e6+10;
int cnt=0;
struct node{
	int ls,rs;
	int key,pri;
	int size;
}t[M];
void newNode(int x){
	cnt++;
	t[cnt].size=1;
	t[cnt].ls=t[cnt].rs=0;
	t[cnt].key=x;
	t[cnt].pri=rand();
}
void Update(int u){
	t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}
void rotate(int &o,int d){
	int k;
	if(d==1){
		k=t[o].rs;
		t[o].rs=t[k].ls;
		t[k].ls=o;
	} 
	else{
		k=t[o].ls;
		t[o].ls=t[k].rs;
		t[k].rs=o;
	}
	t[k].size=t[o].size;
	Update(o);
	o=k;
}
void Insert(int &u,int x){
	if(u==0){
		newNode(x);u=cnt;return;
	}
	t[u].size++;
	if(x>=t[u].key)Insert(t[u].rs,x);
	else Insert(t[u].ls,x);
	if(t[u].ls!=0&&t[u].pri>t[t[u].ls].pri)rotate(u,0);
	if(t[u].rs!=0&&t[u].pri>t[t[u].rs].pri)rotate(u,1);
	Update(u);
}
void Del(int &u,int x){
	t[u].size--;
	if(t[u].key==x){
		if(t[u].ls==0&&t[u].rs==0){u=0;return;}
		if(t[u].ls==0||t[u].rs==0){u=t[u].ls+t[u].rs;return;}
		if(t[t[u].ls].pri<t[t[u].rs].pri){
			rotate(u,0);
			Del(t[u].rs,x);
			return ;
		}else{
			rotate(u,1);
			Del(t[u].ls,x);
			return;
		}
	}
	if(t[u].key>=x)Del(t[u].ls,x);
	else Del(t[u].rs,x);
	Update(u);
}
int Rank(int u,int x){
	if(u==0)return 0;
	if(x>t[u].key)return t[t[u].ls].size+1+Rank(t[u].rs,x);
	return Rank(t[u].ls,x);
}
int kth(int u,int k){
	if(k==t[t[u].ls].size+1)return t[u].key;
	if(k>t[t[u].ls].size+1)return kth(t[u].rs,k-t[t[u].ls].size-1);
	if(k<=t[t[u].ls].size)kth(t[u].ls,k);
}
int Precurson(int u,int x){
	if(u==0)return 0;
	if(t[u].key>=x)return Precurson(t[u].ls,x);
    int tmp=Precurson(t[u].rs,x);
    if(tmp==0)return t[u].key;
    return tmp;
}
int Successor(int u,int x){
	if(u==0)return 0;
	if(t[u].key<=x)return Successor(t[u].rs,x);
    int tmp=Successor(t[u].ls,x);
    if(tmp==0)return t[u].key;
    return tmp;
}
int main(){
	srand(time(NULL));
    int root=0;
    int n;cin>>n;
    int ji=0;
    while(n--){
        int op,x;
        cin>>op>>x;
        if(op==5){
            Insert(root,x);
            ji++;
        }
        if(op==1){
           printf("%d\n",Rank(root,x)+1);
        }
        if(op==2){
            printf("%d\n",kth(root,x));
        }
        if(op==3){
            if(Rank(root,x)+1!=1)
       	  printf("%d\n",Precurson(root,x));
            else cout<<-2147483647<<endl;
        }
        if(op==4){
            if(Rank(root,x)+1!=n)
         printf("%d\n",Successor(root,x));
            else cout<<2147483647<<endl;
        }
    }
	return 0;
}
2023/11/12 20:20
加载中...