社区讨论

Splay求调AWA

P3369【模板】普通平衡树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo25ihwn
此快照首次捕获于
2023/10/23 08:20
2 年前
此快照最后确认于
2023/11/03 08:37
2 年前
查看原帖
悬赏关注一枚
CPP
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0;bool f=1;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=0;
	for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+c-'0';
	return f?x:(~(x-1));
}
int n,root,tot;//totΪÊ÷µÄ¹æÄ£ 
struct Splay{int siz,val,ch[2],cnt,fa;}t[1000019];
inline bool get(int p){return p==t[t[p].fa].ch[1];}//·µ»ØËüÊÇ·ñÊǸ¸Ç×µÄÓÒ¶ù×Ó
inline void pushup(int p){t[p].siz=t[t[p].ch[0]].siz+t[t[p].ch[1]].siz+t[p].cnt;}//ά»¤×ÓÊ÷µÄ¹æÄ£ 
inline void clear(int p){t[p].siz=t[p].val=t[p].ch[0]=t[p].ch[1]=t[p].cnt=t[p].fa=0;}//Ïú»ÙÒ»¸ö½Úµã 
inline void rotate(int p){//Ðýת 
	int y=t[p].fa,z=t[y].fa,ward=get(p);
	t[y].ch[ward]=t[p].ch[ward^1];
	if(t[p].ch[ward^1])t[t[p].ch[ward^1]].fa=y;
	t[p].ch[ward^1]=y;t[y].fa=p;t[p].fa=z;
	if(z)t[z].ch[y==t[z].ch[1]]=p;
	pushup(y);pushup(p);
}
inline void splay(int p){//תÖÁ¸ù½Úµã 
	for(int f=t[p].fa;f=t[p].fa;rotate(p))
		if(t[f].fa)rotate(get(p)==get(f)?f:p);
	root=p;
}
inline void insert(int k){//²åÈë 
	if(!root){
		t[++tot].val=k;t[tot].cnt++;root=tot;
		pushup(root);
		return;
	}
	int cur=root,f=0;
	while(true){
		if(t[cur].val==k){
			t[cur].cnt++;
			pushup(cur);pushup(f);
			splay(cur);break;
		}
		f=cur;cur=t[cur].ch[t[cur].val<k];
		if(!cur){
			t[++tot].val=k;t[tot].cnt++;t[tot].fa=f;
			t[f].ch[t[f].val<k]=tot;
			pushup(tot);pushup(f);
			splay(tot);break;
		}
	}
}
inline int rk(int k){//ÇókµÄÅÅÃû 
	int res=0,cur=root;
	while(true){
		if(k<t[cur].val)cur=t[cur].ch[0];
		else{
			res+=t[t[cur].ch[0]].siz;
			if(k==t[cur].val){
				splay(cur);
				return res+1;
			}
			res+=t[cur].cnt;
			cur=t[cur].ch[1];
		}
	}
}
inline int askforrank(int k){//ÇóÅÅÃûkµÄÊý 
	int cur=root;
	while(true){
		if(t[cur].ch[0]&&k<=t[t[cur].ch[0]].siz)cur=t[cur].ch[0];
		else{
			k-=t[cur].cnt+t[t[cur].ch[0]].siz;
			if(k<=0){splay(cur);return t[cur].val;}
			cur=t[cur].ch[1];
		}
	}
}
inline int pre(){//xΪ¸ùºóÇóxµÄǰÇý 
	int cur=t[root].ch[0];
	if(!cur)return cur;
	while(t[cur].ch[1])cur=t[cur].ch[1];
	splay(cur);return t[cur].val;
}
inline int nxt(){//Çóºó¼Ì 
	int cur=t[root].ch[1];
	if(!cur)return cur;
	while(t[cur].ch[0])cur=t[cur].ch[0];
	splay(cur);return t[cur].val;
}
inline void del(int k){
	rk(k);
	if(t[root].cnt>1){t[root].cnt--;pushup(root);return;}
	if(!t[root].ch[0]&&!t[root].ch[1]){clear(root);root=0;return;}
	if(!t[root].ch[0]){int cur=root;root=t[root].ch[1];t[root].fa=0;clear(cur);return;}
	if(!t[root].ch[1]){int cur=root;root=t[root].ch[0];t[root].fa=0;clear(cur);return;}
	int cur=root,x=pre();
	t[t[cur].ch[1]].fa=x;
	t[x].ch[1]=t[cur].ch[1];
	clear(cur);pushup(root);
}
signed main(){
	n=read();
	for(int i=1;i<=n;++i){
		int opt=read(),x=read();
		switch(opt){
			case 1:{insert(x);break;}
			case 2:{del(x);break;}
			case 3:{printf("%d\n",rk(x));break;}
			case 4:{printf("%d\n",askforrank(x));break;}
			case 5:{insert(x);printf("%d\n",pre());del(x);break;}
			case 6:{insert(x);printf("%d\n",nxt());del(x);break;}
		}
	}
}

回复

0 条回复,欢迎继续交流。

正在加载回复...