萌新刚学OI,AVL挂的一败涂地
查看原帖
萌新刚学OI,AVL挂的一败涂地
773747
yutong_Seafloor楼主2023/11/29 14:40

AVL树求调,本人比较菜,刚学谢谢(是AVL树

#include<bits/stdc++.h>
using namespace std;
#define ls(r) tr[r].rl[0]
#define rs(r) tr[r].rl[1]
struct avl
{
	long long rl[2],sz,val,he,cnt; 
}tr[500010];
long long jds,n,opt,x,i,rt;
//旋转~ 
void pushup(long long r)
{
	if(!r) return ;
	tr[r].he=max(tr[ls(r)].he,tr[rs(r)].he)+1;
	tr[r].sz=tr[ls(r)].sz+tr[rs(r)].sz+1;
}
void rote(long long &r,long long opt)
{
	long long t=tr[r].rl[!opt];
	tr[r].rl[!opt]=tr[t].rl[opt];
	tr[t].rl[opt]=r;
	pushup(r),pushup(t);
	r=t;
}
void rote2(long long &r,long long opt)
{
	rote(tr[r].rl[opt],opt);
	rote(r,!opt); 
}
//论如何平衡呢
void wh(long long &r)
{
	long long lf=ls(r),rg=rs(r);
	if(tr[lf].he==tr[rg].he+2)
	{
		if(tr[ls(lf)].he==tr[rg].he+1) rote(r,1);//单旋一次~
		else if(tr[rs(lf)].he==tr[rg].he+1) rote2(r,0); 
	}
	else if(tr[rg].he==tr[lf].he+2)
	{
		if(tr[rs(rg)].he==tr[lf].he+1) rote(r,0);
		else if(tr[ls(rg)].he==tr[lf].he+1) rote2(r,1);
	}
	pushup(r);
}
void cz1(long long &r,long long x)
{
	if(!r)
	{
		tr[++jds].val=x,r=jds;
		pushup(r);
		return ; 
	}
	if(x<tr[r].val) cz1(ls(r),x);
	else cz1(rs(r),x);
	wh(r);
}
long long cz2(long long &r,long long x)
{
	long long tmp;
	if(tr[r].val==x || x<tr[r].val && !ls(r) || x>tr[r].val && !rs(r))
	{
		tmp=tr[r].val;
		if(!ls(r) || !rs(r))
		{
			r=ls(r)+rs(r);
			return tmp; 
		}
		tr[r].val=cz2(ls(r),x);
	}
	else
	{
		if(x<tr[r].val) tmp=cz2(ls(r),x);
		else tmp=cz2(rs(r),x); 
	}
	wh(r);
	return tmp;
}
long long cz3(long long r,long long x)
{
	if(!r) return 1;
	if(x<=tr[r].val) return cz3(ls(r),x);
	return tr[ls(r)].sz+1+cz3(rs(r),x); 
}
long long cz4(long long r,long long x)
{
	if(tr[ls(r)].sz>=x) return cz4(ls(r),x);
	if(tr[ls(r)].sz+1>=x)  return tr[r].val;
	return cz4(rs(r),x-tr[ls(r)].sz-1);
}
long long cz5(long long r,long long x)
{
	if(!r) return -1e9;
	if(tr[r].val>=x) return cz5(ls(r),x);
	return max(tr[r].val,cz5(rs(r),x)); 
}
long long cz6(long long r,long long x)
{
	if(!r) return 1e9;
	if(tr[r].val<=x) return cz6(rs(r),x);
	return min(tr[r].val,cz6(ls(r),x)); 
}
int main()
{
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>opt>>x;
		if(opt==1) cz1(rt,x);
		if(opt==2) cz2(rt,x);
		if(opt==3) cout<<cz3(rt,x);
		if(opt==4) cout<<cz4(rt,x);
		if(opt==5) cout<<cz5(rt,x);
		if(opt==6) cout<<cz6(rt,x);
	}
	return 0;
} 
2023/11/29 14:40
加载中...