0分求助
查看原帖
0分求助
728666
ZY_85楼主2023/4/15 09:10
#include<iostream>
using namespace std;
const int MAXN=10001;
int Size[MAXN],Num[MAXN],L[MAXN],R[MAXN],Val[MAXN],index=1;
void insert(int V,int Pos=1){
	Size[Pos]++;
	if(Num[Pos]==0&&!L[Pos]==0&&!R[Pos]==0){//空节点
		Val[Pos]=V;
		Num[Pos]++;
	}
	else if(V==Val[Pos]){
		Num[Pos]++;
	}
	else if(V>Val[Pos]){
		if(!R[Pos])R[Pos]=++index;
		insert(V,R[Pos]);
	}
	else{
		if(!L[Pos])L[Pos]=++index;
		insert(V,L[Pos]);
	}
	return;
}
int CountLess(int V,int Pos=1){
	if(V<Val[Pos]){
		return L[Pos]?CountLess(V,L[Pos]):0;
	}
	else if(V>Val[Pos]){
		return Size[L[Pos]]+Num[Pos]+(R[Pos]?CountLess(V,R[Pos]):0);
	}
	else return Size[L[Pos]];
}
int CountGreater(int V,int Pos=1){
	if(V<Val[Pos]){
		return Size[R[Pos]]+Num[Pos]+(L[Pos]?CountGreater(V,L[Pos]):0);
	}
	else if(V>Val[Pos]){
		return R[Pos]?CountGreater(V,R[Pos]):0;
	}
	else return Size[R[Pos]];
}
int Find(int k,int Pos=1){
	if(Size[L[Pos]]>k-1){
		Find(k,L[Pos]);
	}
	else if(Size[L[Pos]]+Num[Pos]>k){
		Find(k-Size[L[Pos]]-Num[Pos],R[Pos]);
	}
	else return Val[Pos];
}
int Pre(int V){
	int Temp=CountLess(V);
	return Temp?Find(Temp):-2147483647;
}
int Next(int V){
	int Temp=CountGreater(V);
	return Temp?Find(Size[1]-Temp+1):2147483647;
}
int main(){
	//freopen("Data.out","w",stdout);
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		int F,V;
		scanf("%d%d",&F,&V);
		switch(F){
			case 1:{
				printf("%d\n",CountLess(V)+1);
				break;
			}
			case 2:{
				printf("%d\n",Find(V));
				break;
			}
			case 3:{
				printf("%d\n",Pre(V));
				break;
			}
			case 4:{
				printf("%d\n",Next(V));
				break;
			}
			case 5:{
				insert(V);
				break;
			}
			default:{
				printf("Input Error\n");
				return -1;
			}
		}
	}
	//fclose(stdout);
	return 0;
}
2023/4/15 09:10
加载中...