求助,Splay平衡树做的,全WA
查看原帖
求助,Splay平衡树做的,全WA
209916
youkasgs_wyb楼主2023/7/13 21:21
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
struct SplayNode{
	int chd[3],fa;
	int cnt;
	int val;
	int size;
}Tree[N];
int n;
int root=0,tot=0;
int opt,x;
void Push_up(int u)
{
	Tree[u].size=Tree[Tree[u].chd[0]].size+Tree[Tree[u].chd[1]].size+Tree[u].cnt;
}
void rotate(int u)
{
	register int fa=Tree[u].fa;
	register int gdfa=Tree[fa].fa;
	register int k1=(Tree[fa].chd[1]==u),k2=(Tree[gdfa].chd[1]==fa);
	Tree[gdfa].chd[k2]=u;
	Tree[u].fa=gdfa;
	Tree[fa].chd[k1]=Tree[u].chd[k1^1];
	Tree[Tree[u].chd[k1^1]].fa=fa;
	Tree[u].chd[k1^1]=fa;
	Tree[fa].fa=u;
	Push_up(fa);
	Push_up(u);
}
void Splay(int u,int goal)
{
	while(Tree[u].fa!=goal)
	{
		int fa=Tree[u].fa;
		int gdfa=Tree[fa].fa;
		if(gdfa!=goal)
			(Tree[fa].chd[0]==x)^(Tree[gdfa].chd[0]==fa)?rotate(u):rotate(fa);
		rotate(u);
	}
	if(goal==0) root=u;
}
void Insert(int x)
{
	int u=root,fa=0;
	while(u&&Tree[u].val!=x)
	{
		fa=u;
		u=Tree[u].chd[x>Tree[u].val];
	}
	if(u) Tree[u].cnt++;
	else{
		u=++tot;
		if(fa) Tree[u].chd[x>Tree[u].val]=u;
		Tree[u].chd[0]=0;
		Tree[u].chd[1]=0;
		Tree[u].val=x;
		Tree[u].cnt=1;
		Tree[u].size=1;
		Tree[u].fa=fa;
	}
	Splay(u,0);
}
void Find(int x)
{
	int u=root;
	if(!u) return ;
	while(Tree[u].chd[x>Tree[u].val]&&x!=Tree[u].val)
		u=Tree[u].chd[x>Tree[u].val];
	Splay(u,0);
}
int Next(int x,int f)
{
	Find(x);
	int u=root;
	if((Tree[u].val>x&&f)||(Tree[u].val<x&&!f)) return u;
	u=Tree[u].chd[f];
	while(Tree[u].chd[f^1]) u=Tree[u].chd[f^1];
	return u;
}
void Delete(int x)
{
	int lt=Next(x,0);
	int nt=Next(x,1);
	Splay(lt,0);
	Splay(nt,lt);
	int del=Tree[nt].chd[0];
	if(Tree[del].cnt>1)
	{
		Tree[del].cnt--;
		Splay(del,0);
	}else Tree[nt].chd[0]=0;
}
int K_th(int x)
{
	int u=root;
	if(Tree[u].size<x) return false;
	while(1)
	{
		int lch=Tree[u].chd[0];
		if(x>Tree[lch].size+Tree[u].cnt)
		{
			x-=Tree[lch].size+Tree[u].cnt;
			u=Tree[u].chd[1];
		}else if(Tree[lch].size>=x) u=lch;
		else return Tree[u].val;
	}
}
int main()
{
	Insert(-2147483647);
	Insert(+2147483647); 
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&opt,&x);
		switch(opt)
		{
			case 1:{
				Insert(x);
				break;
			}
			case 2:{
				Delete(x);
				break;
			}
			case 3:{
				Find(x);
				printf("%d\n",Tree[Tree[root].chd[0]].size);
				break;
			}
			case 4:{
				printf("%d\n",K_th(x));
				break;
			}
			case 5:{
				printf("%d\n",Tree[Next(x,0)].val);
				break;
			}
			case 6:{
				printf("%d\n",Tree[Next(x,1)].val);
				break;
			}
		}
	}
	return 0;
}
2023/7/13 21:21
加载中...