社区讨论
Splay,36分求助啊
P3369【模板】普通平衡树参与者 4已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mi6zdi35
- 此快照首次捕获于
- 2025/11/20 13:18 4 个月前
- 此快照最后确认于
- 2025/11/20 13:18 4 个月前
CPP
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int MAXN=100000+5,INF=0x3f3f3f3f;
struct SplayTree{
int id;
int w;//权值
int fa;//父亲
int son[2],num[2];//孩子、左右孩子节点数量
int cnt;//当前值的数量
int size(){//返回子树大小
return num[0]+num[1]+cnt;
}
} spt[MAXN];
int root,newp;//根,新节点的下标
void doSplay(int x,int des);//x转到des
void doRotate(int x);//左右旋
void doInsert(int x);//插入
void doDel(int x);//删除
void bfs();//输出广搜结果
void updNum(int p);//更新孩子节点数量
bool doFind(int x);//查找并转到根
int getMax();//求最大
int getKth(int k);//求第k大
int getPre(int x);//前驱
int getNex(int x);//后继
int main(){
int n;
scanf("%d",&n);
for(register int i=1;i<=n;++i){
spt[i].id=i;
}
doInsert(-INF);
doInsert(INF);
for(int i=1;i<=n;++i){
int opt,num;
scanf("%d",&opt);
if(opt==1){
scanf("%d",&num);
doInsert(num);
}
else if(opt==2){
scanf("%d",&num);
doDel(num);
}
else if(opt==3){
scanf("%d",&num);
doFind(num);
int ans=spt[root].num[0]+spt[root].cnt;
printf("%d\n",ans-1);
}
else if(opt==4){
scanf("%d",&num);
if(num==1){
printf("%d\n",spt[getMax()].w);
continue;
}
int ans=getKth(num);
ans=spt[ans].w;
printf("%d\n",ans);
}
else if(opt==5){
scanf("%d",&num);
if(doFind(num)){
int ans=getPre(num);
ans=spt[ans].w;
printf("%d\n",ans);
}
else{
doInsert(num);
int ans=getPre(num);
ans=spt[ans].w;
printf("%d\n",ans);
doDel(num);
}
}
else if(opt==6){
scanf("%d",&num);
if(doFind(num)){
int ans=getNex(num);
ans=spt[ans].w;
printf("%d\n",ans);
}
else{
doInsert(num);
int ans=getNex(num);
ans=spt[ans].w;
printf("%d\n",ans);
doDel(num);
}
}
else if(opt==7){
bfs();
}
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...