BST 0分求条
查看原帖
BST 0分求条
997236
theb0t楼主2024/3/5 21:38
#include <bits/stdc++.h>

using namespace std;

int q,op,x;
int rt=0x3f3f3f3f;
int a[10005];
int cnt[10005];
int ls[10005];
int rs[10005];
int t[10005];
int rk(int i,int x) {
	if(i==0) {
		return 0;
	}
	if(a[i]<x) {
		return cnt[ls[i]]+1+rk(rs[i],x);
	}
	else {
		return rk(ls[i],x);
	}
}
int Rk(int i,int x,int sum) {
	if(i==0) {
		return 0;
	}
	if(cnt[ls[i]]+1+sum==x) {
		return a[i];
	}
	else if(cnt[ls[i]]+1+sum<x) {
		return Rk(rs[i],x,sum+ls[i]+1);
	}
	else {
		return Rk(ls[i],x,sum);
	}
}
void insert(int i,int x) {
	if(i==0) {
		return;
	}
	cnt[i]++;
	if(a[x]>a[i]) {
		if(rs[i]) {
			insert(rs[i],x);
		}
		else {
			rs[i]=x;
		}
	}
	else if(a[x]<a[i]) {
		if(ls[i]) {
			insert(ls[i],x);
		}
		else {
			ls[i]=x;
		}
	}
}
int solve(int i,int x,int ans) {
//	cout<<ans<<endl;
	if(x<=a[i]) {
		if(ls[i]==0) return ans;
		return solve(ls[i],x,ans);
	}
	else {
		if(rs[i]==0) return (a[i]<x)?a[i]:ans;
		return max(a[i],solve(rs[i],x,ans));
	}
}
int so1ve(int i,int x,int ans) {
	if(x>=a[i]) {
		if(rs[i]==0) return ans;
		return so1ve(rs[i],x,ans);
	}
	else {
		if(ls[i]==0) return (a[i]>x)?a[i]:ans;
		return min(a[i],so1ve(ls[i],x,ans));
	}
}
void Print(int i) {
//	cout<<"g";
	if(i==0) {
		return;
	}
	cout<<a[i]<<"的左孩子是"<<a[ls[i]]<<endl;
	cout<<a[i]<<"的右孩子是"<<a[rs[i]]<<endl;
	Print(ls[i]);
	Print(rs[i]);
}
int num;
int main() {
	
	cin>>q;
	while(q--) {
		cin>>op>>x; 
		if(op==1) { //查x的排名
			cout<<rk(rt,x)+1<<endl;
		}
		else if(op==2) { //查排名为x的数
			cout<<Rk(rt,x,0) <<endl;
		}
		else if(op==3) { //求比x小的最大的数
			cout<<solve(rt,x,-2147483647)<<endl;
		}
		else if(op==4) { //比x大的最小的数
//			int k=so1ve(rt,x);
//			cout<<(k==0?2147483647:k)<<endl;
			cout<<so1ve(rt,x,2147483647)<<endl;
		}
		else {
			a[++num]=x;
			if(num==1) {
				rt=1;
				cnt[rt]--;
			}
			cnt[num]++;
			insert(rt,num);
		}
//		Print(rt);
//		for(int i=1;i<=num;i++) {
//			cout<<cnt[i]<<" ";
//		}
	}
	return 0;
}
2024/3/5 21:38
加载中...