FHQ Treap 随机TLE/MLE/WA
查看原帖
FHQ Treap 随机TLE/MLE/WA
633466
LiaoYF1楼主2024/5/5 16:54
#include<bits/stdc++.h>
#define int long long
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
const int inf=1e18;
struct node{
    int l,r;
    int val;
    int key;
    int siz;
}tr[100005];
int tot,root;
int newnode(int val){
    tr[++tot].val=val;
    tr[tot].key=rand();
    tr[tot].siz=1;
    return tot;
}
void pushup(int p){
    tr[p].siz=tr[tr[p].l].siz+tr[tr[p].r].siz+1;
}
void split(int p,int v,int &x,int &y){
    if(!p){
        x=y=0;
        return;
    }
    if(tr[p].val<=v){
        x=p;
        split(tr[p].r,v,tr[p].r,y);
    }else{
        y=p;
        split(tr[p].l,v,x,tr[p].l);
    }
    pushup(p);
}
int merge(int x,int y){
    if(!x||!y){
        return x+y;
    }
    if(tr[x].key<tr[y].key){
        tr[x].r=merge(tr[x].r,y);
        pushup(x);
        return x;
    }else{
        tr[y].l=merge(x,tr[x].l);
        pushup(y);
        return y;
    }
}
void insert(int val){
    int x,y,z;
    split(root,val,x,y);
    z=newnode(val);
    root=merge(merge(x,z),y);
}
void del(int val){
    int x,y,z;
    split(root,val,x,z);
    split(x,val-1,x,y);
    y=merge(tr[y].l,tr[y].r);
    root=merge(merge(x,y),z);
}
int getkth(int p,int k){
    if(k<=tr[tr[p].l].siz){
        return getkth(tr[p].l,k);
    }
    if(k==tr[tr[p].l].siz+1){
        return p;
    }
    return getkth(tr[p].r,k-tr[tr[p].l].siz-1);
}
int getpre(int val){
    int x,y;
    split(root,val-1,x,y);
    int p=getkth(x,tr[x].siz);
    root=merge(x,y);
    return tr[p].val;
}
int getsuc(int val){
    int x,y;
    split(root,val,x,y);
    int p=getkth(y,1);
    root=merge(x,y);
    return tr[p].val;
}
int getrank(int val){
    int x,y;
    split(root,val-1,x,y);
    int res=tr[x].siz+1;
    root=merge(x,y);
    return res;
}
void solve(){
    srand(time(0));
    int q;
    cin>>q;
    while(q--){
        int op,x;
        cin>>op>>x;
        if(op==1){
            insert(x);
        }else if(op==2){
            del(x);
        }else if(op==3){
            cout<<getrank(x)<<"\n";
        }else if(op==4){
            //debug(getkth(root,x));
            cout<<tr[getkth(root,x)].val<<"\n";
        }else if(op==5){
            cout<<getpre(x)<<"\n";
        }else if(op==6){
            cout<<getsuc(x)<<"\n";
        }
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t,multitest=0;
    if(multitest)cin>>t;
    else t=1;
    while(t--){
        solve();
    }
    return 0;
}

样例过了

2024/5/5 16:54
加载中...