TLE求调
查看原帖
TLE求调
1493494
Janguiham0319楼主2025/1/28 15:15
#include<iostream>
#define maxn 100010

using namespace std;

int n,root,cnt,op,x;

struct node{
	int left,right,size,value,num;
	node(int l,int r,int s,int v):
		left(l),right(r),size(s),value(v),num(1){}
	node(){};
}t[maxn];
int require(int x,int root){	//查询数x的排名
	if( root ){
		if(x<t[root].value){
			return require(x,t[root].left);
		}
		if(x>t[root].value){
			return require(x,t[root].right)+t[t[root].left].size+t[root].num;
		}
		else return t[t[root].left].size+t[root].num;
	}
	return 1;
}
int kth(int x,int root){	//查询排名为x的数
	if(x<=t[t[root].left].size){
		return kth(x,t[root].left);
	}
	if(x<=t[t[root].left].size+t[root].num){
		return t[root].value;
	}
	else return kth(x-t[root].size-t[root].num,t[root].right);
}
inline void update(int root){	//insert函数中更新结点size信息
	t[root].size=t[t[root].left].size+t[t[root].right].size+t[root].num;
}
void insert(int x,int &root){	//插入数x
	if(x<t[root].value){
		if(!t[root].left){
			t[t[root].left=++cnt]=node{0,0,1,x};
		}
		else insert(x,t[root].left);
	}
	if(x>t[root].value){
		if(!t[root].right){
			t[t[root].right=++cnt]=node{0,0,1,x};
		}
		else insert(x,t[root].right);
	}
	else t[root].num++;
	update(root);
}
int main(){
	cin>>n;
	int num=0;
	t[root=++cnt]=node{0,0,1,0x7f};
	while(n--){
		cin>>op>>x;
		num++;
		if(op==1) cout<<require(x,root);
		if(op==2) cout<<kth(x,root);
		if(op==3) cout<<kth(require(x,root)-1,root);
		if(op==4) cout<<kth(require(x,root)+1,root);
		if(op==5) num--,insert(x,root);
		if(op<=4) cout<<endl;
	}
}
2025/1/28 15:15
加载中...