P5076全WA玄关求条
  • 板块学术版
  • 楼主Xlon_WU
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/2/24 19:08
  • 上次更新2024/2/24 21:40:02
查看原帖
P5076全WA玄关求条
958002
Xlon_WU楼主2024/2/24 19:08

BST,参考题解区第一篇题解。

全WA

#include <iostream>
#include <climits>
using namespace std;
struct node{
	int val,lc,rc,cnt,size;
}Tree[10010];
int q,cnt;
void Insert(int x,int val){
	Tree[x].size++;
	if(Tree[x].val==val){
		Tree[x].cnt++;
		return;
	}
	if(Tree[x].val>val){
		if(Tree[x].lc)Insert(Tree[x].lc,val);
		else{
			Tree[x].lc=++cnt;
			Tree[cnt].val=val;
			Tree[cnt].size=Tree[cnt].cnt=1;
		}
	}else{
		if(Tree[x].rc)Insert(Tree[x].rc,val);
		else{
			Tree[x].rc=++cnt;
			Tree[cnt].val=val;
			Tree[cnt].size=Tree[cnt].cnt=1;
		}
	}
}
int FindPrevious(int x,int val,int ans){
	if(Tree[x].val>=val){
		if(Tree[x].lc==0)return ans;
		return FindPrevious(Tree[x].lc,val,ans);
	}
	if(Tree[x].rc==0)return Tree[x].val;
	return FindPrevious(Tree[x].rc,val,Tree[x].val);
}
int FindNext(int x,int val,int ans){
	if(Tree[x].val<=val){
		if(Tree[x].rc==0)return ans;
		return FindNext(Tree[x].rc,val,ans);
	}
	if(Tree[x].lc==0)return Tree[x].val;
	return FindNext(Tree[x].lc,val,Tree[x].val);
}
int FindValue(int x,int rk){
	if(x==0)return INT_MAX;
	if(Tree[Tree[x].lc].size>=rk)return FindValue(Tree[x].lc,rk);
	if(Tree[x].cnt+Tree[Tree[x].lc].size>=rk)return Tree[x].val;
	return FindValue(Tree[x].rc,rk-Tree[x].cnt-Tree[Tree[x].lc].size);
}
int FindRank(int x,int val){
	if(x==0)return 0;
	if(Tree[x].val>val)return FindRank(Tree[x].lc,val);
	if(Tree[x].val==val)return Tree[Tree[x].lc].size;
	return FindRank(Tree[x].rc,val)+Tree[Tree[x].lc].size+Tree[x].cnt;
}
int main(){
	cin>>q;
	for(int i=1;i<=q;i++){
		int op,val;
		cin>>op>>val;
		if(op==1)cout<<FindRank(1,val)+1<<endl;
		if(op==2)cout<<FindValue(1,val)<<endl;
		if(op==3)cout<<FindPrevious(1,val,INT_MIN)<<endl;
		if(op==4)cout<<FindNext(1,val,INT_MAX)<<endl;
		if(op==5){
			if(cnt==0){
				Tree[++cnt].cnt=Tree[cnt].size=1;
				Tree[cnt].val=val;
			}else Insert(1,val);
		}
	}
	return 0;
}
2024/2/24 19:08
加载中...