MLE求助
查看原帖
MLE求助
602968
Wangziruican楼主2023/3/30 16:29
#include<iostream>
using namespace std;
int q,op,x,tr=1,m;
#define MAXN 10010 
struct tree{
	int left/*左节点*/,right/*右节点*/,ans/*该节点个数*/,size/*以该节点为子树的数的个数*/,value/*该点的权值*/;
}a[MAXN];
void insert(int z,int root){/*z为插入的结点值,root为根节点*/
	if(tr==1){
		a[tr].value=z;
		a[tr].left=0;
		a[tr].right=0;
		a[tr].ans=1;
		a[tr].size=0;
	}else{
		if(a[root].value==z){
			a[root].ans++;
		}else{
			a[root].size++;
			if(z<a[root].value){
				if(a[root].left==0){
					a[root].left=tr;
					a[tr].value=z;
					a[tr].left=0;
					a[tr].right=0;
					a[tr].ans=1;
					a[tr].size=0;
				}else{
					insert(z,a[root].left);
				}
			}
			if(z>a[root].value){
				if(a[root].right==0){
					a[root].right=tr;
					a[tr].value=z;
					a[tr].left=0;
					a[tr].right=0;
					a[tr].ans=1;
					a[tr].size=0;
				}else{
					insert(z,a[root].right);
				}
			} 
		}		
	}
}
int checkx(int num,int root){/*z为插入的结点值,root为根节点,num为数量*/
	if(x==a[root].value){
		return num;
	}else if(x<a[root].value){
		checkx(num,a[root].left);
	}else{
		checkx(num+a[a[root].left].size+a[root].ans,a[root].right);
	}
}
int xcheck(int z,int root){/*z为在当前子树排名,root为根节点*/
	if(z>=a[a[root].left].size+1 && z<=a[a[root].left].size+a[root].ans){
		return a[root].value;
	}else if(z<a[a[root].left].size){
		xcheck(z,a[root].left);
	}else{
		xcheck(z-a[a[root].left].size-a[root].ans,a[root].right);
	}
}
int main(){
	cin>>q;
	for(int i=0;i<q;i++){
		cin>>op>>x;
		switch(op){
			case 1:
				cout<<checkx(1,1)<<endl;
				break;
			case 2:
				cout<<xcheck(x,1)<<endl;
				break;
			case 3:
				cout<<xcheck(checkx(1,1)-1,1)<<endl;
				break;
			case 4:
				cout<<xcheck(checkx(1,1)+1,1)<<endl;
				break;
			case 5:
				insert(x,1);
				tr++; 
				break;
		} 
	}
	return 0;
} 
2023/3/30 16:29
加载中...