84分Splay求助!
查看原帖
84分Splay求助!
398312
国王的新账号楼主2021/8/16 17:09

#8#9wa了,求求大佬教教我吧

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int rt,num,n,a;
int sz[maxn],fa[maxn],son[maxn][2],val[maxn],cnt[maxn];
void pushup(int x)
{
	if(x){
		sz[x]=cnt[x];
		if(son[x][0]){
			sz[x]+=sz[son[x][0]];
		}
		if(son[x][1]){
			sz[x]+=sz[son[x][1]];
		}
	}
}
bool get(int x)
{
	return x==son[fa[x]][1];
}
void clear(int x)
{
	son[x][1]=son[x][0]=fa[x]=val[x]=sz[x]=cnt[x]=0;
}
void edit(int x,int f)
{
	num++;
	son[num][0]=son[num][1]=0;
	fa[num]=f,sz[num]=1;
	cnt[num]=1;
	val[num]=x;
}
void rotate(int x)
{
	int y=fa[x],z=fa[y];
	bool side=get(x);
	son[y][side]=son[x][side^1],fa[son[y][side]]=y;
	son[x][side^1]=y,fa[y]=x,fa[x]=z;
	if(z!=0)	son[z][son[z][1]==y]=x;
	pushup(y),pushup(x);
}
void splay(int x)
{
	for(int i;(i=fa[x])!=0;rotate(x)){
		if(fa[i]!=0)	rotate(get(x)==get(i)?i:x);
	}
	rt=x;
}
void insert(int x)
{
	if(rt==0){
		edit(x,0);
		rt=num;
		return ;
	}
	if(val[rt]==x){
		cnt[x]++;
		pushup(rt);
		return ;
	}
	for(int f=rt,now=son[rt][val[rt]<x];;f=now,now=son[now][val[now]<x]){
		if(now==0){
			edit(x,f);
			son[f][val[f]<x]=num;
			pushup(f);
			splay(num);
			return ;
		}
		if(val[now]==x){
			cnt[now]++;
			pushup(now);
			pushup(f);
			splay(now);
			return ;
		}
	}
}
int find(int x)
{
	int now=rt;
	while(val[now]!=x&&now!=0)	now=son[now][val[now]<x];
	return now;
}
int lower()
{
	int now=son[rt][0];
	while(son[now][1])	now=son[now][1];
	return now;
}
int upper()
{
	int now=son[rt][1];
	while(son[now][0])	now=son[now][0];
	return now;
}
void del(int x)
{
	int now=find(x);
	splay(now);
	if(cnt[rt]>1){
		cnt[rt]--;
		pushup(rt);
		return ;
	}
	if(!(son[rt][0])&&!(son[rt][1])){
		clear(rt);
		rt=0;
		return ;
	}
	if(son[rt][0]==0){
		rt=son[rt][1];
		clear(fa[rt]);
		fa[rt]=0;
		return ;
	}else if(son[rt][1]==0){
		rt=son[rt][0];
		clear(fa[rt]);
		fa[rt]=0;
		return ;
	}
	int his=rt;
	splay(lower());
	son[rt][1]=son[his][1];
	fa[son[his][1]]=rt;
	pushup(rt);
	clear(his);
}
int kth(int k)
{
	int now=rt;
	while(1){
		if(son[now][0]&&k<=sz[son[now][0]])	now=son[now][0];
		else{
			int tmp=(son[now][0]?sz[son[now][0]]:0)+cnt[now];
			if(k<=tmp)	return val[now];
			k-=tmp,now=son[now][1];
		}
	}
}
int Rank(int x)
{
	int now=find(x);
	splay(now);
	return sz[son[now][0]]+1;
}
void test(int now)
{
	if(son[now][0]!=0)	test(son[now][0]);
	printf("%d ",val[now]);
	if(son[now][1]!=0)	test(son[now][1]);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int jud,x;
		scanf("%d%d",&jud,&x);
		switch(jud){
			case 1:
				insert(x);
//				test(rt);
//				printf("\n");
				break;
			case 2:
				del(x);
//				test(rt);
//				printf("\n");
				break;
			case 3:
				insert(x);
				printf("%d\n",Rank(x));
				del(x);
				break;
			case 4:
				printf("%d\n",kth(x));
				break;
			case 5:
				insert(x);
//				test(rt);
//				printf("\n");
				printf("%d\n",val[lower()]);
				del(x);
//				test(rt);
//				printf("\n");
				break;
			case 6:
				insert(x);
//				test(rt);
//				printf("\n");
				printf("%d\n",val[upper()]);
				del(x);
//				test(rt);
//				printf("\n");
				break;
		}
	}
//	printf("%d\n",a);
	return 0;
 } 
2021/8/16 17:09
加载中...