社区讨论

FHQ Treap MLE on #19,#20 求助

P3835【模板】可持久化平衡树参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lt9x394q
此快照首次捕获于
2024/03/02 18:05
2 年前
此快照最后确认于
2024/03/02 18:09
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5;
int n,root[maxn+5],tot;
struct node{
    int lc,rc,val,key,siz;
}bt[maxn*20+5];
int newnode(int v){
    bt[++tot].val=v,bt[tot].key=rand(),bt[tot].siz=1;
    return tot;
}
void update(int x){
    bt[x].siz=bt[bt[x].lc].siz+bt[bt[x].rc].siz+1;
}
void split(int x,int v,int &a,int &b){
    if(x==0){
        a=b=0;
        return;
    }
    if(bt[x].val<=v){
        a=newnode(bt[x].val),bt[a]=bt[x];
        split(bt[a].rc,v,bt[a].rc,b);
        update(a);
    }
    else{
        b=newnode(bt[x].val),bt[b]=bt[x];
        split(bt[b].lc,v,a,bt[b].lc);
        update(b);
    }
}
int merge(int a,int b){
    if(a==0||b==0){
        return a+b;
    }
    if(bt[a].key<bt[b].key){
        int p=newnode(bt[a].val);
        bt[p]=bt[a],bt[p].rc=merge(bt[p].rc,b);
        update(p);
        return p;
    }
    else{
        int p=newnode(bt[b].val);
        bt[p]=bt[b],bt[p].lc=merge(a,bt[p].lc);
        update(p);
        return p;
    }
}
int kth(int x,int k){
    if(bt[bt[x].lc].siz>=k){
        return kth(bt[x].lc,k);
    }
    else if(bt[bt[x].lc].siz+1>=k){
        return bt[x].val;
    }
    else{
        return kth(bt[x].rc,k-bt[bt[x].lc].siz-1);
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int op,id,x;
        scanf("%d %d %d",&id,&op,&x);
        root[i]=root[id];
        int a,b,c;
        if(op==1){
            split(root[i],x,a,b);
            root[i]=merge(merge(a,newnode(x)),b);
        }
        if(op==2){
            split(root[i],x,a,c);
            split(a,x-1,a,b);
            b=merge(bt[b].lc,bt[b].rc),root[i]=merge(merge(a,b),c);
        }
        if(op==3){
            split(root[i],x-1,a,b);
            printf("%d\n",bt[a].siz+1);
            root[i]=merge(a,b);
        }
        if(op==4){
            printf("%d\n",kth(root[i],x));
        }
        if(op==5){
            split(root[i],x-1,a,b);
            if(bt[a].siz==0){
                puts("-2147483647");
            }
            else{
                printf("%d\n",kth(a,bt[a].siz));
            }
            root[i]=merge(a,b);
        }
        if(op==6){
            split(root[i],x,a,b);
            if(bt[b].siz==0){
                puts("2147483647");
            }
            else{
                printf("%d\n",kth(b,1));
            }
            root[i]=merge(a,b);
        }
    }
    return 0;
}

回复

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

正在加载回复...