社区讨论

求助!WA*3

P5076【深基16.例7】普通二叉树(简化版)参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m42reuvp
此快照首次捕获于
2024/11/29 21:08
去年
此快照最后确认于
2025/11/04 13:39
4 个月前
查看原帖
CPP
#include<iostream>
#include<map>
using namespace std;
struct tree{
	int value,lt,rt,si;
};
tree inTree[10000+1];
int tot=0;
map<int,bool>	dp;
void insert(int x,int pos){
	inTree[pos].si++;
	if(tot==0){
		inTree[++tot].value=x;
		return;
	}
	if(x<inTree[pos].value){
		if(!inTree[pos].lt){
			inTree[pos].lt=++tot;
			inTree[tot].value=x;
			inTree[tot].si=1;
			return;
		}else{
			insert(x,inTree[pos].lt);
		}
	}else{
		if(!inTree[pos].rt){
			inTree[pos].rt=++tot;
			inTree[tot].value=x;
			inTree[tot].si=1;
			return;
		}else{
			insert(x,inTree[pos].rt);
		}
	}
}
int findRank(int x,int pos){
	if(pos==0)	return 0;
	if(x==inTree[pos].value){
		return inTree[inTree[pos].lt].si;
	}else if(x<inTree[pos].value){
		return findRank(x,inTree[pos].lt);
	}else{
		return inTree[inTree[pos].lt].si+1+findRank(x,inTree[pos].rt);
	}
}
int findNumber(int x,int pos){
	if(pos==0)	return 0;
	if(inTree[inTree[pos].lt].si+1==x){
		return inTree[pos].value;
	}else if(inTree[inTree[pos].lt].si+1>x){
		return findNumber(x,inTree[pos].lt);
	}else{
		return findNumber(x-inTree[inTree[pos].lt].si-1,inTree[pos].rt);
	}
}
int main(){
	int q;
	cin>>q;
	for(int i=1;i<=q;i++){
		int op,x;
		cin>>op>>x;
		int t;
		switch(op){
			case 1:
				cout<<findRank(x,1)+1<<endl;
				break;
			case 2:
				cout<<findNumber(x,1)<<endl;
				break;
			case 3:
				t=findRank(x,1);
				t=findNumber(t,1);
				if(t)	cout<<t<<endl;
				else	cout<<-2147483647<<endl;	
				break;
			case 4:
				if(dp[x])	t=findRank(x,1)+2;
				else	t=findRank(x,1)+1;
				t=findNumber(t,1);
				if(t)	cout<<t<<endl;
				else	cout<<2147483647<<endl;
				break;
			case 5:
				dp[x]=1;
				insert(x,1);
				break;
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...