求调qwq
查看原帖
求调qwq
763878
Jerry_heng楼主2024/1/23 09:39
#include<bits/stdc++.h>
using namespace std;
int q,op,cnt;
struct node{
	int val,key,ch[2];
	int tsiz,msiz;
}tree[4000010];
void maintain(int &o){
	int sum=0;
	if(tree[o].ch[0])sum+=tree[tree[o].ch[0]].tsiz;
	if(tree[o].ch[1])sum+=tree[tree[o].ch[1]].tsiz;
	tree[o].tsiz=sum+tree[o].msiz;
}
void rotate(int &o,int pos){
	int t=tree[o].ch[pos^1];
	tree[o].ch[pos^1]=tree[t].ch[pos];
	tree[t].ch[pos]=o;
	maintain(o);
	maintain(t);
	o=t;
}
void insert(int &o,int x){
	if(o==0){
		o=++cnt;
		tree[o].msiz=tree[o].tsiz=1;
		tree[o].ch[0]=tree[o].ch[1]=0;
		tree[o].key=rand();
		tree[o].val=x;
		return;
	}
	if(tree[o].val==x){
		tree[o].msiz++;
		maintain(o);
	}
	else if(tree[o].val>x){
		insert(tree[o].ch[0],x);
		maintain(o);
		if(tree[tree[o].ch[0]].key>tree[o].key)rotate(o,1);
	}
	else{
		insert(tree[o].ch[1],x);
		maintain(o);
		if(tree[tree[o].ch[1]].key>tree[o].key)rotate(o,0);
	}
}
void remove(int &o,int x){
	if(tree[o].val==x){
		if(tree[o].msiz>1)tree[o].msiz--;
		else{
			if(!tree[o].ch[0]&&!tree[o].ch[1])o=0;
			else if(!tree[o].ch[0]){
				rotate(o,0);
				remove(tree[o].ch[0],x);
			}
			else if(!tree[o].ch[1]){
				rotate(o,1);
				remove(tree[o].ch[1],x);
			}
			else{
				if(tree[tree[o].ch[0]].key>tree[tree[o].ch[1]].key){
					rotate(o,1);
					remove(tree[o].ch[1],x);
				}
				else{
					rotate(o,0);
					remove(tree[o].ch[0],x);
				}
			}
		}
	}
	else if(tree[o].val<x){
		remove(tree[o].ch[1],x);
	}
	else{
		remove(tree[o].ch[0],x);
	}
	maintain(o);
}
int find_rk(int o,int x){
	int ans=0;
	while(o){
		int cnt;
		if(tree[o].ch[0])cnt=0;else cnt=tree[tree[o].ch[0]].tsiz;
		if(tree[o].val<x)o=tree[o].ch[0];
		else if(tree[o].val==x){
			return ans+cnt+1;
		}
		else{
			ans+=cnt+tree[o].msiz;
			o=tree[o].ch[1];
		}
	}
}
int find_val(int o,int x){
	while(o){
		int cnt;
		if(tree[o].ch[0])cnt=0;else cnt=tree[tree[o].ch[0]].tsiz;
		if(cnt>=x)o=tree[o].ch[0];
		else if(x<=cnt+tree[o].msiz)return tree[o].val;
		else x-=cnt+tree[o].msiz,o=tree[o].ch[1];
	}
}
int find_pre(int o,int x){
	int pre;
	while(o){
		if(tree[o].val<x)pre=tree[o].val,o=tree[o].ch[1];
		else o=tree[o].ch[0];
	}
	return pre;
}
int find_nxt(int o,int x){
	int nxt;
	while(o){
		if(tree[o].val>x)nxt=tree[o].val,o=tree[o].ch[0];
		else o=tree[o].ch[1];
	}
	return nxt;
}
int main(){
	srand(time(0));
	scanf("%d",&q);
	int rt=0;
	while(q--){
		scanf("%d",&op);
		int x;
		if(op==1){
			scanf("%d",&x);
			insert(rt,x);
		}
		if(op==2){
			scanf("%d",&x);
			remove(rt,x);
		}
		if(op==3){
			scanf("%d",&x);
			insert(rt,x);
			printf("%d\n",find_rk(rt,x));
			remove(rt,x);
		}
		if(op==4){
			scanf("%d",&x);
			printf("%d\n",find_val(rt,x));
		}
		if(op==5){
			scanf("%d",&x);
			insert(rt,x);
			printf("%d\n",find_pre(rt,x));
			remove(rt,x);
		}
		if(op==6){
			scanf("%d",&x);
			insert(rt,x);
			printf("%d\n",find_nxt(rt,x));
			remove(rt,x);
		}
	}
	return 0;
}
2024/1/23 09:39
加载中...