社区讨论

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 条回复,欢迎继续交流。

正在加载回复...