P3369 Splay 求调
  • 板块灌水区
  • 楼主Zq_water
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/19 17:50
  • 上次更新2023/11/2 19:06:08
查看原帖
P3369 Splay 求调
895435
Zq_water楼主2023/9/19 17:50

21pts

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;

int n,cnt,rt;
int son[maxn][2],fa[maxn],val[maxn],tot[maxn],siz[maxn];

int read();
void push_up(int u);
bool check(int u);
void rotate(int x);
void splay(int x,int k);
void insert(int x);
void del(int x);
int getrank(int u,int k);
int getval(int u,int k);
int Nxt();
int nxt(int x);
int Pre();
int pre(int x);

int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return x*f;
}

void push_up(int u){siz[u]=siz[son[u][0]]+siz[son[u][1]]+tot[u];}
bool check(int u){return u==son[fa[u]][1];}
void rotate(int x){
	int y=fa[x],z=fa[y],k=check(x);
	son[y][k]=son[x][k^1],fa[son[x][k^1]]=y;
	son[x][k^1]=y,fa[y]=x;
    fa[x]=z;
    if(z) son[z][son[z][1]==y]=x;
    push_up(x),push_up(y);
}
void splay(int x,int k){
	while(fa[x]!=k){
		int y=fa[x],z=fa[y];
		if(z!=k) check(x)^check(y)?rotate(x):rotate(y);
		rotate(x);
	}
	if(!k) rt=x;
}
void insert(int u,int k){
	int f=0;
	while(u&&val[u]!=k) f=u,u=son[u][val[u]<k];
	if(!u){
		u=++cnt;
		tot[u]=siz[u]=1;
		fa[u]=f,val[u]=k;
		if(f) son[f][val[f]<k]=cnt;
	}
	else tot[u]++;
	splay(u,0);
}
int getrank(int u,int k){
	if(!u) return 1;
	if(val[u]==k){
		splay(u,0);
		return siz[son[u][0]]+1;
	}
	if(k<val[u]) return getrank(son[u][0],k);
	return getrank(son[u][1],k)+siz[son[u][0]]+tot[u];
}
int getval(int u,int k){
	if(!u) return 0;
	if(siz[son[u][0]]<k&&k<=siz[son[u][0]]+tot[u]){
		splay(u,0);
		return val[u];
	}
	if(k<=siz[son[u][0]]) return getval(son[u][0],k);
	return getval(son[u][1],k-siz[son[u][0]]-tot[u]);
}
int Pre(){
	int u=son[rt][0];
	if(!u) return u;
	while(son[u][1]) u=son[u][1];
	splay(u,0);
	return u; 
}
int pre(int x){
	insert(rt,x);
	int t=Pre();
	del(x);
	return val[t];
}
int Nxt(){
	int u=son[rt][1];
	if(!u) return u;
	while(son[u][0]) u=son[u][0];
	splay(u,0);
	return u;
}
int nxt(int x){
	insert(rt,x);
	int t=Nxt();
	del(x);
	return val[t];
}
void del(int x){
	getrank(rt,x);
	if(tot[rt]>1){
		tot[rt]--;
		push_up(rt);
		return;
	}
	if(!son[rt][0]&&!son[rt][1]){
		rt=0;
		return;
	}
	if(!son[rt][0]){
		rt=son[rt][1];
		fa[rt]=0;
		return;
	}
	if(!son[rt][1]){
		rt=son[rt][0];
		fa[rt]=0;
	}
	int u=rt,t=Pre();
	fa[son[u][1]]=rt,son[rt][1]=son[u][1];
	push_up(rt);
}

int main(){
	n=read();
	for(int i=1,op,x;i<=n;i++){
		op=read(),x=read();
		if(op==1) insert(rt,x);
		if(op==2) del(x);
		if(op==3) printf("%d\n",getrank(rt,x));
		if(op==4) printf("%d\n",getval(rt,x));
		if(op==5) printf("%d\n",pre(x));
		if(op==6) printf("%d\n",nxt(x));
	}
	return 0;
}
2023/9/19 17:50
加载中...