非旋treap 65pts 求调,悬赏10 rmb,球球啦
查看原帖
非旋treap 65pts 求调,悬赏10 rmb,球球啦
283694
wxtluogu楼主2023/10/31 20:48
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N =1e5+7;
int n,root,tot;
struct T{
    int l,r,size,val,key,cnt;
}t[N*2];
mt19937 rg(521);
int newnode(int val){
    t[++tot]={0,0,1,val,(int)rg(),1};
    if(root==0){
        root=1;
    }
    return tot;
}
void print(int p){
    if(!p){
        return ;
    }
    print(t[p].l);
    cout<<t[p].val<<" ";
    print(t[p].r);
}
void pushup(int p){
    t[p].size=t[t[p].l].size+t[t[p].r].size+t[p].cnt;
}
void split_rank(int rt,int rank,int &x,int &y){
    if(!rt){
        x=0,y=0;
        return ;
    }
    int &l=t[rt].l,&r=t[rt].r;
    if(t[l].size<rank){
        x=rt;
        split_rank(r,max(0,rank-t[l].size-t[rt].cnt),r,y);
        pushup(rt);
    }else{
        y=rt;
        split_rank(l,rank,x,l);
        pushup(rt);
    }
}
int merge(int x,int y){
    if(!x||!y){
        return x+y;
    }
    if(t[x].key<=t[y].key){
        t[x].r=merge(t[x].r,y);
        pushup(x);
        return x;
    }else{
        t[y].l=merge(x,t[y].l);
        pushup(y);
        return y;
    }
}
void split(int rt,int val,int &x,int &y){
    if(!rt){
        x=0,y=0;
        return ;
    }
    int &l=t[rt].l,&r=t[rt].r;
    if(t[rt].val<=val){
        x=rt;
        split(r,val,r,y);
    }else{
        y=rt;
        split(l,val,x,l);
    }
    pushup(rt);
}
void insert(int k){
    int x=0,y=0,z=0,x2=0;
    split(root,k,x,y);
    split(x,k-1,x2,z);
    if(t[z].cnt==0){
        z=newnode(k);
    }else{
        t[z].cnt++;
    }
    root=merge(merge(x2,z),y);
}
void del(int k){
    int x=0,y=0,z=0,x2=0;
    split(root,k,x,y);
    split(x,k-1,x2,z);
    if(t[z].cnt==1){
        t[z].cnt=0;
        root=merge(x2,y);
        return ;
    }else{
        t[z].cnt--;
    }
    root=merge(merge(x2,z),y);
}
int rk(int k){
    int x=0,y=0,z=0,x2=0;
    split(root,k,x,y);
    split(x,k-1,x2,z);
    int ans=t[x2].size+1;
    root=merge(merge(x2,z),y);
    return ans;
}
int maxx(int rt){
    if(t[t[rt].r].cnt!=0){
        return maxx(t[rt].r); 
    }
    return t[rt].val;
}
int kth(int k){
    int x=0,y=0,z=0,x2=0;
    split_rank(root,k,x,y);
    int ans=maxx(x);
    root=merge(x,y);
    return ans;
}
int nextt(int k){ 
    int x=0,y=0,z=0,x2=0;
    split(root,k,x,y);
    split_rank(y,1,x2,z);
    int ans=t[x2].val;
    root=merge(merge(x,x2),z);
    return ans;
}
int pre(int k){
    int x=0,y=0,z=0,x2=0;
    split(root,k-1,x,y);
    int ans=maxx(x);
    root=merge(x,y);
    return ans;
}
int main(){
    freopen("love.you","r",stdin);
    freopen("ac.ans","w",stdout);
    scanf("%d",&n);
    int x,y;
    int cnt=0;
    for(int i=1;i<=n;++i){
        cnt++;
        scanf("%d%d",&x,&y);
        if(x==1){
            insert(y);
            // print(root);
            // cout<<endl;
        }else if(x==2){
            del(y);
        }else if(x==3){
            printf("%d\n",rk(y));
        }else if(x==4){
            printf("%d\n",kth(y));
        }else if(x==5){
            printf("%d\n",pre(y));
        }else{
           printf("%d\n",nextt(y));
        }
        // cout<<x<<" "<<y<<endl;
        // if(cnt==790){
        //     return 0;
        // }
    }
    return 0;
}
2023/10/31 20:48
加载中...