求助平衡树,校对了一下午,还是不对,吐了
查看原帖
求助平衡树,校对了一下午,还是不对,吐了
123784
KSCN楼主2021/5/15 17:07
include<bits/stdc++.h>
using namespace std;
int ch[200050][2];
int fa[200050];
int cnt[200050];
int val[200050];
int size[200050];
int ncnt,root;int n,op,x;
bool jud(int o)
{//cout<<"LOL"<<endl;
	return ch[fa[o]][1]==o;
}
void push(int o)
{
	/////shaole
	size[o]=size[ch[o][1]]+size[ch[o][0]]+cnt[o];

}
void rotate(int x)
{
	int y=fa[x],z=fa[y],k=jud(x),w=ch[x][k^1];
	ch[y][k]=w; fa[w]=y;
	ch[z][jud(y)]=x; fa[x]=z;
	ch[x][k^1]=y; fa[y]=z;
	push(y);push(x);
}
void splay(int o,int goal=0)
{
	while(fa[o]!=goal)
	{
		int y=fa[o],z=fa[y];
		if(z!=goal)
		{
			if(jud(o)==jud(y)) rotate(y);
			else rotate(o);
		}
		rotate(o);
	}
	if(!goal)
	{
		root=o;
	}	
}
void insert(int x)
{
	int cur=root,p=0;
	while(cur&&val[cur]!=x)
	{
		p=cur;
		cur=ch[cur][x>val[cur]];
	}
	if(cur)
	{
		cnt[cur]++;
	}
	else
	{
		cur=++ncnt;
		if(p)
		ch[p][x>val[p]]=cur;
		ch[cur][1]=ch[cur][0]=0;
		fa[cur]=p;
		val[cur]=x;
		cnt[cur]=size[cur]=1;
	}
	splay(cur);
}
void find(int x)
{
	int cur=root;
	while(ch[cur][x>val[cur]]&&val[cur]!=x)
	{
		cur=ch[cur][x>val[cur]];
	}
	splay(cur);
}
int kth(int x)
{
	int cur=root;
	while(1)
	{
		if(ch[cur][0]&&x<=size[ch[cur][0]]) cur=ch[cur][0];
		else if(x>size[ch[cur][0]]+cnt[cur])
		{
			x-=size[ch[cur][0]]+cnt[cur];
			cur=ch[cur][1];
		}
		else
		{
			return cur;
		}
		
	}
}
int per(int k)
{
	find(k);
	if(k>val[root]) return root;
	int cur=ch[root][0];
	while(ch[cur][1]) cur=ch[cur][1];
	return cur;
}
int aft(int k)
{
	find(k);
	if(k<val[root]) return root;
	int cur=ch[root][1];
	while(ch[cur][0]) cur=ch[cur][0];
	return cur;
}
void remove(int x)
{
	int latu=per(x);
	int next=aft(x);
	splay(latu);
	splay(next,latu);
	int del = ch[next][0];
    if (cnt[del] > 1) {
        cnt[del]--;
        splay(del);
    }
    else ch[next][0] = 0, push(next), push(root);
}
int main() {
	
    scanf("%d", &n);
    insert(0x3f3f3f3f);
    insert(0xcfcfcfcf);
    while (n--) {
        scanf("%d%d", &op, &x);
        switch (op) {
            case 1: insert(x); break;
            case 2: remove(x); break;
            case 3: find(x); printf("%d\n", size[ch[root][0]]); break;
            case 4: printf("%d\n", val[kth(x+1)]); break;
            case 5: printf("%d\n", val[per(x)]); break;
            case 6: printf("%d\n", val[aft(x)]); break;
        }
    }
}
2021/5/15 17:07
加载中...