BST 模板求助
查看原帖
BST 模板求助
710829
cjZYZtql楼主2023/1/7 09:02

现在是只有查询排名错了,也有可能是其他的错误导致的。自己初学不会调,求助大佬/

#include <bits/stdc++.h>
#define mkpr make_pair
#define fi first
#define se second
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define dF(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;

inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void write(int x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');}
inline void writeln(int x){write(x);putchar('\n');}
inline void writesp(int x){write(x);putchar(' ');}
inline int lowbit(int x) {return x&(-x);}
typedef pair<int,int> Pair;
const int N=1000005,inf=0x7f7f7f7f;
struct BST{int l,r,val,cnt,siz;} a[N];
int n,tot,root;
void New(int v){a[++tot].val=v;a[tot].cnt=a[tot].siz=1;}
void Build(){New(-inf);New(inf);root=1;a[1].r=2;}
void Insert(int p,int v){
	a[p].siz++;
	if(v==a[p].val) {a[p].cnt++; return ;}
	if(v<a[p].val) {
		if(a[p].l) Insert(a[p].l,v);
		else {New(v);a[p].l=tot;}
	}else {
		if(a[p].r) Insert(a[p].r,v);
		else {New(v);a[p].r=tot;}
	}
}
int Qrank(int p,int v){
	if(!p) return 0;
	if(a[p].val==v) return a[a[p].l].siz+1;
	if(a[p].val>v) return Qrank(a[p].r,v)+a[a[p].l].siz+a[p].cnt;
	else return Qrank(a[p].l,v);
}
int Qkth(int p,int k){
	if(!p) return inf;
	if(a[a[p].l].siz>=k) return Qkth(a[p].l,k);
	if(a[a[p].l].siz+a[p].cnt>=k) return a[p].val;
	return Qkth(a[p].r,k-a[a[p].l].siz-a[p].cnt);
}
int Qfront(int p,int v,int ans){
	if(a[p].val>=v){
		if(!a[p].l) return ans;
		else return Qfront(a[p].l,v,ans);
	}else{
		if(!a[p].r) return a[p].val;
		else return Qfront(a[p].r,v,a[p].val);
	}
}
int Qnxt(int p,int v,int ans){
	if(a[p].val<=v){
		if(!a[p].r) return ans;
		else return Qnxt(a[p].r,v,ans);
	}else{
		if(!a[p].l) return a[p].val;
		else return Qnxt(a[p].l,v,a[p].val);
	}
}
int main(){
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n;
	while(n--){
		int op,v;cin>>op>>v;
		if(op==1){
			cout<<Qrank(1,v)<<'\n';
		}else if(op==2){
			cout<<Qkth(1,v)<<'\n';
		}else if(op==3){
			cout<<Qfront(1,v,-inf)<<'\n';
		}else if(op==4){
			cout<<Qnxt(1,v,inf)<<'\n';
		}else{
			if(!tot){
				a[++tot].val=v;a[tot].cnt=a[tot].siz=1;
			}else Insert(1,v);
		}
	}
    return 0;
}
2023/1/7 09:02
加载中...