fhq treap 求调
查看原帖
fhq treap 求调
328935
calmsGZ省队2024楼主2024/7/7 16:02
#include<bits/stdc++.h>

using namespace std;
struct node{
    int val;
    int rnd;
    int l,r;
    int siz;
}tree[1000005];
int tot;


void pushup(int p){
    tree[p].siz=tree[tree[p].l].siz+tree[tree[p].r].siz+1;
}

void split(int p,int &l,int &r,int val){
    if(!p){
        l=0,r=0;
        return;
    }
    if(tree[p].val<=val){
        l=p;
        split(tree[p].r,tree[p].r,r,val);
        pushup(p);
    }else{
        r=p;
        split(tree[p].l,l,tree[p].l,val);
        pushup(p);
    }
}

int merge(int x,int y){
    if(!x||!y){
        return x+y;
    }
    if(tree[x].rnd>tree[y].rnd){
        tree[x].r=merge(tree[x].r,y);
        pushup(x);
        return x;
    }else{
        tree[y].l=merge(x,tree[y].l);
        pushup(y);
        return y;
    }
}

int newx(int x){
	tot++;
    tree[tot].val=x;
    tree[tot].rnd=rand();
    tree[tot].siz=1;
    tree[tot].l=tree[tot].r=0;
    return tot;
}

int root;

void insert(int v){
    int x=0,y=0,z=0;
    split(root,x,y,tree[v].val);
    root=merge(merge(x,v),y);
}

void erase(int v){
    int x=0,y=0,z=0;
    split(root,x,y,v);
    split(root,x,z,v-1);
    z=merge(tree[z].l,tree[z].r);
    root=merge(merge(x,z),y);
}

int askp(int v){
    int x=0,y=0,z=0;
    split(root,x,y,v-1);
    int ans=tree[x].siz+1;
    root=merge(x,y);
    return ans;
}

int asks(int p,int v){
    if(tree[tree[p].l].siz+1==v){
        return tree[p].val;
    }
    if(tree[tree[p].l].siz>=v){
        return asks(tree[p].l,v);
    }else{
        return asks(tree[p].r,v-tree[tree[p].l].siz-1);
    }
}

int pre(int v){
    int x=0,y=0;
    split(root,x,y,v-1);
    int ans=asks(x,tree[x].siz);
    root=merge(x,y);
    return ans;
}

int aft(int v){
    int x=0,y=0;
    split(root,x,y,v);
    //cout<<y<<endl;
    int ans=asks(y,1);
    root=merge(x,y);
    return ans;
}

int n;
int op,val;

int main(){
    srand(time(0));
//     ios::sync_with_stdio(0);
//     cin.tie(0);
//     cout.tie(0);
    cin>>n;
    while(n--){
        cin>>op>>val;
        if(op==1){
            int p=newx(val);
            insert(p);
        }else if(op==2){
            erase(val);
        }else if(op==3){
            cout<<askp(val)<<"\n";
        }else if(op==4){
            cout<<asks(root,val)<<"\n";
        }else if(op==5){
            cout<<pre(val)<<"\n";
        }else{
            cout<<aft(val)<<"\n";
        }
    }
    return 0;
}

2024/7/7 16:02
加载中...