我是小孩,刚学OI1ms,悬关求调
查看原帖
我是小孩,刚学OI1ms,悬关求调
749175
114514xxx楼主2024/11/5 10:35

Record

#include<bits/stdc++.h>
#define int long long
#define ls t[p].l
#define rs t[p].r
using namespace std;
const int N=1e5+25;
const int inf=0x7fffffff;
inline int read(){
    int x=0,f=1;
    char c=getchar_unlocked();
    while(!isdigit(c)){
        if(c=='-')f*=-1;
        c=getchar_unlocked();
    }
    while(isdigit(c)){
        x=(x<<3)+(x<<1)+(c^48);
        c=getchar_unlocked();
    }
    return x*f;
}
struct treap{
    int l,r;
    int val,dat;
    int siz,cnt;
}t[N];
int tot,root;
inline void update(int p){
    t[p].siz=t[ls].siz+t[rs].siz+t[p].cnt;
}
inline void zig(int &p){
    int q=t[p].l;
    t[p].l=t[q].r,t[q].r=p,p=q;
    update(rs),update(p);
}
inline void zag(int &p){
    int q=t[p].r;
    t[p].r=t[q].l,t[q].l=p,p=q;
    update(ls),update(p);
}
inline int New(int val){
    t[++tot].val=val;
    t[tot].dat=rand();
    t[tot].cnt=1,t[tot].siz=1;
    return tot;
}
inline void build(){
    New(-inf),New(inf);
    root=1,t[root].r=2;
    update(root);
}
inline int GetRankByVal(int p,int val){
    if(!p)return 0;
    if(val==t[p].val)return t[ls].siz+1;
    if(val<t[p].val)return GetRankByVal(ls,val);
    return (GetRankByVal(rs,val)+t[ls].siz+t[p].cnt);
}
inline int GetValByRank(int p,int rnk){
    if(!p)return inf;
    if(t[ls].siz>=rnk)return GetValByRank(ls,rnk);
    if(t[ls].siz+t[p].cnt>=rnk)return t[p].val;
    return GetValByRank(t[p].r,rnk-t[ls].siz-t[p].cnt);
}
inline void Insert(int &p,int val){
    if(!p){
        p=New(val);
        return;
    }
    if(val==t[p].val){
        t[p].cnt++,update(p);
        return;
    }
    if(val<t[p].val){
        Insert(ls,val);
        if(t[p].dat<t[ls].dat)zig(p);
    }
    else{
        Insert(rs,val);
        if(t[p].dat<t[rs].dat)zag(p);
    }
    update(p);
}
int GetPre(int val){
    int ans=1;
    int p=root;
    while(p){
        if(val==t[p].val){
            if(t[p].l>0){
                p=t[p].l;
                while(t[p].r>0)p=t[p].r;
                ans=p;
            }
        break;
        }
        if(t[p].val<val&&t[p].val>t[ans].val)ans=p;
        p=val<t[p].val?t[p].l:t[p].r;
    }
    return t[ans].val;
}
inline int GetNext(int val){
    int ans=2;
    int p=root;
    while(p){
        if(val==t[p].val){
            if(t[p].r>0){
                p=t[p].r;
                while(t[p].l>0)p=t[p].l;
                ans=p;
            }
        break;
        }
        if(t[p].val>val&&t[p].val<t[ans].val)ans=p;
        p=val<t[p].val?t[p].l:t[p].r;
    }
    return t[ans].val;
}
inline void Remove(int &p,int val){
    if(!p)return;
    if(val==t[p].val){
        if(t[p].cnt>=2){
            t[p].cnt--,update(p);
            return;
        }
        if(t[p].l||t[p].r){
            if(!t[p].r||t[ls].dat>t[rs].dat)
                zig(p),Remove(rs,val);
            else zag(p),Remove(ls,val);
            update(p);
        }
        else p=0;
        return ;
    }
    val<t[p].val?Remove(ls,val):Remove(rs,val);
    update(p);
    //return;
}
int n;
signed main(){
    srand(time(0));
    //freopen("treap.ans","w",stdout);
    build();
    cin>>n;
    int opt,x;
    for(int i=1;i<=n;i++){
        opt=read(),x=read();
        switch (opt){
            case 1:{
                Insert(root,x);
                break;
            }
            case 2:{
                Remove(root,x);
                break;
            }
            case 3:{
               // cout<<"beyond\n";
                cout<<GetRankByVal(root,x)-1<<endl;
                break;
            }
            case 4:{
               // cout<<"beyond\n";
                cout<<GetValByRank(root,x+1)<<endl;
                break;
            }
            case 5:{
               // cout<<"beyond\n";
                cout<<GetPre(x)<<endl;
                break;
            }
            case 6:{
               // cout<<"beyond\n";
                cout<<GetNext(x)<<endl;
                break;
            }
        }
    }
}

2024/11/5 10:35
加载中...