社区讨论
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 条回复,欢迎继续交流。
正在加载回复...