蒟蒻 0pts 求调
查看原帖
蒟蒻 0pts 求调
1013479
lyx128楼主2025/1/23 14:35
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5; 
int n;
int opt,x;
struct Splay{
	int son[2];
	int father;
	int val;
	int cnt;
	int size;
	void init(int fa,int v){
		val=v;
		father=fa;
		cnt=size=1;
		return ;
	}
}splay[N+5];
int root;
int tot;
void push_up(int x){
	splay[x].size=splay[splay[x].son[0]].size+splay[splay[x].son[1]].size+splay[x].cnt;
	return ;
}
void turn(int x){//旋转 
	int father=splay[x].father;
	int grandfather=splay[father].father;
	int dir=(splay[father].son[1]==x);//1为左旋,2为右旋
	splay[father].son[dir]=splay[x].son[dir^1];
	splay[splay[x].son[dir^1]].father=father;
	splay[splay[x].son[dir^1]].father;
	splay[grandfather].son[splay[grandfather].son[1]==father]=x;
	splay[x].father=grandfather;
	push_up(x),push_up(father);
	return ;
} 
void Splay(int x,int k){//把x转到k 
	while(splay[x].father!=k){
		int father=splay[x].father;
		int grandfather=splay[father].father;
		if(grandfather!=k)
			((splay[father].son[0]==x)^(splay[father].son[0]==father))?turn(x):turn(father);
		turn(x);
	}
	if(!k)
		root=x;
	return ;
}
void find_splay(int x){
	int k=root;
	while(splay[k].son[x>splay[k].val]&&x!=splay[k].val)
		k=splay[k].son[x>splay[k].val];
	Splay(k,0);
	return ;
}
int get_pre(int x){
	find_splay(x);
	int k=root;
	if(splay[k].val<x)
		return k;
	k=splay[k].son[0];
	while(splay[k].son[1])
		k=splay[k].son[1];
	return k; 
}
int get_suc(int x){
	find_splay(x);
	int k=root;
	if(splay[k].val>x)
		return k;
	k=splay[k].son[1];
	while(splay[k].son[0])
		k=splay[k].son[0];
	return k; 
}
int grank(int x){
	find_splay(x);
	return splay[splay[x].son[0]].size;
}
int rerank(int x){
	int k=root;
	while(1){
		int ls=splay[k].son[0];
		if(splay[ls].size+splay[k].cnt<x){//左边小了 
			x-=splay[ls].size+splay[k].cnt;
			k=splay[ls].son[1];
		}
		else if(splay[ls].size>=x)
			k=splay[k].son[0];
		else
			break;		
	}
	Splay(k,0);
	return splay[k].val;
}
void insert(int x){
	int k=root;
	int last_k=0;
	while(k&&splay[k].val!=x)
		last_k=k,k=splay[k].son[x>splay[k].val];
	if(k)
		++splay[k].cnt;
	else{
		k=++tot;
		splay[last_k].son[x>splay[last_k].val]=k;
		splay[k].init(last_k,x);
	}
	Splay(k,0);
	return ;
}
void del(int x){
	int pre=get_pre(x);
	int suc=get_suc(x);
	Splay(pre,0);
	Splay(suc,pre);
	int del=splay[suc].son[0];
	if(splay[del].cnt>1)
		splay[del].cnt--,Splay(del,0);
	else 
		splay[del].cnt=0,splay[suc].son[0]=0,Splay(suc,0);
	return ;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	insert(-2e9),insert(2e9);
	cin>>n;
	while(n--){
		cin>>opt>>x;
		if(opt==1)
			insert(x);
		else if(opt==2)
			del(x);
		else if(opt==3)
			cout<<grank(x)<<"\n";
		else if(opt==4)
			cout<<rerank(x+1)<<"\n";
		else if(opt==5)
			cout<<splay[get_pre(x)].val<<"\n";
		else
			cout<<splay[get_suc(x)].val<<"\n"; 
	}
	return 0;
}

2025/1/23 14:35
加载中...