P5076 普通二叉树(简化版)只有20分【急】
  • 板块题目总版
  • 楼主Tsz1024_AK
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/5 09:20
  • 上次更新2023/11/3 05:49:57
查看原帖
P5076 普通二叉树(简化版)只有20分【急】
794430
Tsz1024_AK楼主2023/8/5 09:20

代码

#include<bits/stdc++.h> 
using namespace std; 
int cnt=1; 
struct node{ 
	int left,right; 
	int value,num,size; 
}t[100005]; 
void insert(int x,int root){ 
	if(cnt==1){ 
		node tmp{0,0,x,1,1}; t[cnt]=tmp; 
		cnt++; 
	}else{ 
		if(x<t[root].value){ 
			if(t[root].left==0){ 
				node tmp{0,0,x,1,1}; t[cnt]=tmp; t[root].left=cnt; 
				cnt++; 
			}else insert(x,t[root].left); 
		} 
		if(x==t[root].value) t[root].num++; 
		if(x>t[root].value){ 
			if(t[root].right==0){ 
				node tmp{0,0,x,1,1}; t[cnt]=tmp; t[root].right=cnt; 
				cnt++; 
			}else insert(x,t[root].right); 
		} 
	}
	t[root].size=t[t[root].left].size+t[t[root].right].size+t[root].num; 
} 
int query1(int x,int root){ 
	if(root==0) return 1; 
	if(x<t[root].value) return query1(x,t[root].left); 
	if(x==t[root].value) return t[t[root].left].size+1; 
	if(x>t[root].value) return t[t[root].left].size+t[root].num+query1(x,t[root].right); 
} 
int query2(int x,int root){ 
	if(x<=t[t[root].left].size) return query2(x,t[root].left); 
	if(x<=t[t[root].left].size+t[root].num) return t[root].value;
	return query2(x-t[t[root].left].size-t[root].num,t[root].right); 
} 
int main(){ 
	int n,op,x; 
	cin>>n; 
	for(int i=0;i<=n;i++){ 
		cin>>op>>x;
		if(op==1) cout<<query1(x,1)<<endl; 
		if(op==2) cout<<query2(x,1)<<endl; 
		if(op==3){ 
			int tmp=query1(x,1); 
			if(tmp==1) cout<<-21474546778983647<<endl; 
			else cout<<query2(tmp-1,1)<<endl; 
		} 
		if(op==4){ 
			int tmp=query1(x+1,1); 
			if(tmp==cnt) cout<<2147486456453647<<endl; 
			else cout<<query2(tmp,1)<<endl; 
		} 
		if(op==5) insert(x,1); 
	}
	return 0;
}
2023/8/5 09:20
加载中...