28分#1#2#12AC其余全WA
查看原帖
28分#1#2#12AC其余全WA
507534
YBaggio楼主2022/3/29 21:53
#include<iostream>
#include<cstdio>
#define int long long 
#define inf (1000000000+10)
using namespace std;
const int maxn=100010;
int n,tot,root;
struct Node{
	int lc,rc,val,cnt,size,pri;
	#define lc(x)t[x].lc
	#define rc(x)t[x].rc
	#define v(x)t[x].val
	#define p(x)t[x].pri
	#define c(x)t[x].cnt
	#define s(x)t[x].size
}t[maxn];
int Rand(){
	static long long res=114514;
	return (res*=2333)%inf;
}
void upt(int k){s(k)=s(lc(k))+s(rc(k))+c(k);}
void zig(int &k){
	int y=lc(k);
	lc(k)=rc(y);
	rc(y)=k;
	upt(k);k=y;upt(k);
}
void zag(int &k){
	int y=rc(k);
	rc(k)=lc(y);
	lc(y)=k;
	upt(k);k=y;upt(k);
}
void insert(int &k,const int &key){
	if(!k){
		k=++tot;rc(k)=lc(k)=0;
		p(k)=Rand();c(k)=s(k)=1;v(k)=key;
		return;
	}
	s(k)++;
	if(key==v(k))c(k)++;
	else if(key<v(k)){
		insert(lc(k),key);
		if(p(lc(k))<p(k))zig(k);	
	}else{
		insert(rc(k),key);
		if(p(rc(k))<p(k))zag(k);
	}
	upt(k);return;
}
void del(int &k,const int &key){
	if(!k)return;
	if(key==v(k)){
		if(c(k)>1)c(k)--,s(k)--;
		else if(!lc(k)||!rc(k))k=lc(k)+rc(k);
		else if(p(lc(k))<p(rc(k)))zig(k),del(k,key);
		else zag(k),del(k,key);
	}
	s(k)--;
	if(key<v(k))del(lc(k),key);
	else del(rc(k),key);
	upt(k);return;
}
int pre(int key){
	int x=root,res=-inf;
	while(x){
		if(key<v(x))x=lc(x);
		else res=v(x),x=rc(x);
	}
	return res;
}
int nex(int key){
	int x=root,res=inf;
	while(x){
		if(key>v(x))x=rc(x);
		else res=v(x),x=lc(x);
	}
	return res;
}
int qkth(int k){
	int x=root;
	while(x){
		if(s(lc(x))<k&&s(lc(x))+c(x)>=k)return v(x);
		if(s(lc(x))>=k)x=lc(x);	
		else k-=(s(lc(x))+c(x)),x=rc(x); 
	}
	return inf;
}
int qrank(int key){
	int x=root,res=0;
	while(x){
		if(key==v(x))return res+s(lc(x))+1;
		if(key<v(x))x=lc(x);
		else res+=s(lc(x))+c(x),x=rc(x); 
	}
	return res;
}
signed main(){
	scanf("%lld",&n);
	while(n--){
		int op,x;
		scanf("%lld%lld",&op,&x);
		if(op==1)insert(root,x);
		else if(op==2)del(root,x);
		else if(op==3)printf("%lld\n",qrank(x));
		else if(op==4)printf("%lld\n",qkth(x));
		else if(op==5)printf("%lld\n",pre(x));
		else if(op==6)printf("%lld\n",nex(x));
	}
	return 0;
} 
2022/3/29 21:53
加载中...