AVL求助 (玄棺)
查看原帖
AVL求助 (玄棺)
874990
emmoy楼主2024/7/5 18:46

rt

#include<bits/stdc++.h>
#define N 100010
using namespace std;
int n,m,root;
int cnt,w[N],val[N],h[N],sz[N],ls[N],rs[N];
void upd(int p)
{
	sz[p]=sz[ls[p]]+sz[rs[p]]+w[p];
	h[p]=max(h[ls[p]],h[rs[p]])+1;
}
int get_b(int p)
{
	return h[ls[p]]-h[rs[p]];
}
void le(int &p)
{
	int t=rs[p];
	rs[p]=ls[t];
	ls[t]=p;
	upd(p),upd(t);
	p=t;
}
void ri(int &p)
{
	int t=ls[p];
	ls[p]=rs[t];
	rs[t]=p;
	upd(p),upd(t);
	p=t;
}
void insert(int &p,int k)
{
	if(!p)
	{
		p=++cnt;
		w[p]=sz[p]=1,val[p]=k;
		return ;
	}
	sz[p]++;
	if(k==val[p]) {w[p]++;return;}
	if(k<val[p])
	{
		insert(ls[p],k);
		if(get_b(p)==2)
		{
			if(get_b(ls[p])==1) ri(p);
			else le(ls[p]),ri(p);
		}
	}
	else
	{
		insert(rs[p],k);
		if(get_b(p)==-2)
		{
			if(get_b(rs[p])==-1) le(p);
			else ri(rs[p]),le(p);
		}
	}
	upd(p);
}
int ans=0;
void up(int p,int k)
{
	if(!p) return;
	if(val[p]<k) ans=p,up(rs[p],k);
	else up(ls[p],k);
}
void dw(int p,int k)
{
	if(!p) return;
	if(val[p]>k) ans=val[p],dw(ls[p],k);
	else dw(rs[p],k);
}
void del(int &p,int k)
{
	if(!p) return ;
	if(k<val[p]) del(ls[p],k);
	else if(k>val[p]) del(rs[p],k);
	else{
		if(w[p]>1) {w[p]--;return;}
		if(!ls[p]||!rs[p]) {p=ls[p]+rs[p];return;}
		ans=0;
		up(p,val[p]);
		int u=ans;
		val[p]=val[u],w[p]=w[u];
		del(ls[p],val[u]);
	}
	if(p!=0)
	{
		if(get_b(p)==2)
		{
			if(get_b(ls[p])==1) ri(p);
			else le(ls[p]),ri(p);
		}
		if(get_b(p)==-2)
		{
			if(get_b(rs[p])==-1) le(p);
			else ri(rs[p]),le(p);
		}
		upd(p);
	}
}
int rnk(int p,int k)
{
	if(!p) return 1;
	if(val[p]==k) return sz[ls[p]]+1;
	if(k<val[p]) return rnk(ls[p],k);
	else return sz[ls[p]]+w[p]+rnk(rs[p],k);
}
int grnk(int p,int k)
{
	if(!p) return 0;
	if(k<=sz[ls[p]]) return grnk(ls[p],k);
	else if(k>sz[ls[p]]+w[p]) return grnk(rs[p],k-sz[ls[p]]-w[p]);
	else return val[p];
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	while(n--)
	{
		int opt,x;
		cin>>opt>>x;
		if(opt==1) insert(root,x);
		if(opt==2) del(root,x);
		if(opt==3) cout<<rnk(root,x)<<"\n";
		if(opt==4) cout<<grnk(root,x)<<"\n";
		if(opt==5) ans=0,up(root,x),cout<<val[ans]<<"\n";
		if(opt==6) ans=0,dw(root,x),cout<<ans<<"\n";
	}
	return 0;
}

(本人菜,不会用指针)

2024/7/5 18:46
加载中...