萌新刚学平衡树,86分求调
查看原帖
萌新刚学平衡树,86分求调
763540
Silence_nk_zht楼主2024/8/9 14:42
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
struct node{
	int l,r;
	int key,value;
	int cnt,size;
}tr[100010]; 
int n,root,idx;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return f*x;
}
inline void write(int x) {
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
void pushup(int p){
	tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+tr[p].cnt;
}
int add(int key){
	tr[++idx].key=key;
	tr[idx].value=rand();
	tr[idx].cnt=tr[idx].size=1;
	return idx;
}
void start(){
	add(-1e9),add(1e9);
	root=1,tr[1].r=2;
	pushup(root);
} 
void zig(int &p){//右旋 
	int q=tr[p].l;
	tr[p].l=tr[q].r;
	tr[q].r=p;
	p=q;
	pushup(tr[p].r);
	pushup(p);
}
void zag(int &p){//左旋 
	int q=tr[p].r;;
	tr[p].r=tr[q].l;
	tr[q].l=p;
	p=q;
	pushup(tr[p].l);
	pushup(p); 
} 
void insert(int &p,int key){
	if(!p)p=add(key);
	else if(tr[p].key==key)tr[p].cnt++;
	else if(tr[p].key>key){
		insert(tr[p].l,key);
		if(tr[tr[p].l].value>tr[p].value) {
			zig(p);
		}
	}
	else{
		insert(tr[p].r,key);
		if(tr[tr[p].r].value>tr[p].value){
			zag(p);
		}
	}
	pushup(p);
}
void del(int &p,int key){
	if(!p)return ;
	if(tr[p].key==key){
		if(tr[p].cnt>1)tr[p].cnt--;
		else if(tr[p].l || tr[p].r){
			if(!tr[p].r || tr[tr[p].l].value>tr[tr[p].r].value){
				zig(p);
				del(tr[p].r,key);
			}
			else{
				zag(p);
				del(tr[p].l,key);
			}
		}
		else p=0;
	}
	else if(tr[p].key>key)del(tr[p].l,key);
	else del(tr[p].r,key);
	pushup(p);
}
int getr(int p,int key){//通过数值找排名 
	if(!p)return -1e9;
	if(tr[p].key==key) return tr[tr[p].l].size+1;
	if(tr[p].key>key)return getr(tr[p].l,key); 
	return tr[tr[p].l].size+tr[p].cnt+getr(tr[p].r,key); 
}
int getk(int p,int rank){//通过排名找数值 
	if(!p)return 1e9;
	if(tr[tr[p].l].size>=rank)return getk(tr[p].l,rank);
	if(tr[tr[p].l].size+tr[p].cnt>=rank)return tr[p].key;
	return getk(tr[p].r,rank-tr[tr[p].l].size-tr[p].cnt);
}
int getp(int p,int key){//查找严格小于key的最大数 
	if(!p)return -1e9;
	if(tr[p].key>=key)return getp(tr[p].l,key);
	return max(tr[p].key,getp(tr[p].r,key));
}
int getn(int p,int key){//查找严格大于key的最小数 
	if(!p)return 1e9;
	if(tr[p].key<=key)return getn(tr[p].r,key);
	return min(tr[p].key,getn(tr[p].l,key));
}
int main(){
	start();
	scanf("%d",&n);
	while(n--){
		int op,x;
		scanf("%d%d",&op,&x);
		if(op==1)insert(root,x);
		else if(op==2)del(root,x);
		else if(op==3)printf("%d\n",getr(root,x)-1);
		else if(op==4)printf("%d\n",getk(root,x+1));
		else if(op==5)printf("%d\n",getp(root,x));
		else printf("%d\n",getn(root,x)); 
	}
	return 0;
}
2024/8/9 14:42
加载中...