全部MLE求助,悬赏1个小号关注
查看原帖
全部MLE求助,悬赏1个小号关注
481527
AC_CSP楼主2023/2/4 14:51
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+7;
const int INF=2147483647;
int q;
struct node{
	int left_son,right_son;
	int val,cnt;
	int size;
}t[N];
int tot;
inline int get_rank(int u,int x){
	if(x==0) return 1;
	if(t[u].val==x) return t[t[u].left_son].size+1;
	if(t[u].val>x) return get_rank(t[u].left_son,x);
	if(t[u].val<x) return get_rank(t[u].right_son,x)+t[t[u].left_son].size+t[u].cnt;
}
inline int get_num(int u,int x){
	if(x==0) return INF;
	if(t[t[u].left_son].size>=x) return get_num(t[u].left_son,x);
	if(t[t[u].left_son].size+t[u].cnt>=x) return t[u].val;
	if(t[t[u].left_son].size+t[u].cnt<x) return get_num(t[u].right_son,x-t[t[u].left_son].size-t[u].cnt);
}
inline int get_down(int u,int x,int ans){
	if(t[u].val>=x){
		if(t[u].left_son) return get_down(t[u].left_son,x,ans);
		else return ans;
	} 
	else{
		if(t[u].right_son) return get_down(t[u].right_son,x,t[u].val);
		else return t[u].val;
	}
}
inline int get_up(int u,int x,int ans){
	if(t[u].val<=x){
		if(t[u].right_son) return get_up(t[u].right_son,x,ans);
		else return ans;
	}
	else{
		if(t[u].left_son) return get_up(t[u].left_son,x,t[u].val);
		else return t[u].val;
	}
}
inline void insert(int u,int x){
	t[u].size++;
	if(t[u].cnt==0) t[u].val=x;
	if(t[u].val==x){
		t[u].cnt++;
		return;
	}
	if(t[u].val>x){
		if(t[u].left_son) insert(t[u].left_son,x);
		else insert(t[u].left_son=++tot,x);
	}
	if(t[u].val<x){
		if(t[u].right_son) insert(t[u].right_son,x);
		else insert(t[u].right_son=++tot,x);
	}
}
int main(){
	scanf("%d",&q);++tot;
	while(q--){
		int opt,x;
		scanf("%d%d",&opt,&x);
		if(opt==1) printf("%d\n",get_rank(1,x));
		if(opt==2) printf("%d\n",get_num(1,x));
		if(opt==3) printf("%d\n",get_down(1,x,-INF));
		if(opt==4) printf("%d\n",get_up(1,x,INF));
		if(opt==5) insert(1,x);
	}
	return 0;
}
2023/2/4 14:51
加载中...