求条
查看原帖
求条
1285683
lz_fruit楼主2025/1/20 11:33

刚开始学平衡树,想先写个二叉搜索树得一个20分再说,但不知道哪出了问题。

#include <bits/stdc++.h>
using namespace std;

struct Node
{
	int val;
	int l,r;
	int siz,cnt;
} T[100005];
int root=1;
void init()
{
	T[root].val=1e8;
}
int create(int x)
{
	static int tot=1;
	T[++tot]={x,0,0,0,0};
	return tot;
}
int insert(int& rt,int x)//rt子树插入x
{
	if(rt==0) rt=create(x);
	if(T[rt].val==x) 
	{
		T[rt].cnt++,T[rt].siz++;
		return rt;
	}
	int pos;
	if(x<T[rt].val) pos=insert(T[rt].l,x);
	else pos=insert(T[rt].r,x);
	return pos;
}
int remove(int rt,int x)//rt子树删除x
{
	if(rt==0) return 0;
	if(T[rt].val==x)
	{
		if(T[rt].cnt==0) return 0;
		T[rt].cnt--,T[rt].siz--;
		return rt;
	}
	int pos;
	if(x<T[rt].val) pos=remove(T[rt].l,x);
	else pos=remove(T[rt].r,x);
	if(pos!=0) T[rt].siz--;
	return pos;
}
int rnk(int x)//小于x的个数 
{
	int rt=root,ans=0;
	while(rt!=0)
	{
		if(x<=T[rt].val) rt=T[rt].l;
		else ans+=T[T[rt].l].siz,rt=T[rt].r;
	}
	return ans;
}
int query(int k)//排名为k
{
	int rt=root;
	if(T[rt].siz<k) return 0x7fffffff;
	while(1)
	{
		if(T[T[rt].l].siz>=k) rt=T[rt].l;
		else if(T[T[rt].l].siz+T[rt].cnt>=k) return T[rt].val;
		else rt=T[rt].r,k-=(T[T[rt].l].siz+T[rt].cnt);
	}
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int p,q;
		cin>>p>>q;
		if(p==1) insert(root,q);
		if(p==2) remove(root,q);
		if(p==3) cout<<(rnk(q)+1);
		if(p==4) cout<<query(q);
		if(p==5) cout<<query(rnk(q));
		if(p==6) cout<<query(rnk(q+1)+1);
	}
	return 0;
}
2025/1/20 11:33
加载中...