28pts 求调,马蜂良好
查看原帖
28pts 求调,马蜂良好
920406
违规用户名920406楼主2024/12/20 09:15
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+1,INF=1e9;
int n,op,x,root,tot,son[N][2],val[N],pri[N],siz[N],cnt[N];
int New(int p)
{
    val[++tot]=p;
    pri[tot]=rand();
    siz[tot]=1;
    cnt[tot]=1;
    return tot;
}
void push_up(int p)
{
    siz[p]=siz[son[p][0]]+siz[son[p][0]]+cnt[p];
}
void bulid()
{
    root=New(-INF);
    son[root][1]=New(INF);
    push_up(root);
}
void rotate(int& p,int d)
{
    int q=son[p][d^1];
    son[p][d^1]=son[q][d];
    son[q][d]=p;
    p=q;
    push_up(son[p][d^1]);
    push_up(p);
}
void insert(int& p,int x)
{
    if(!p)
    {
        p=New(x);
        return;
    }
    if(x==val[p])   cnt[p]++;
    else
    {
        int d=(x>val[p])?1:0;
        insert(son[p][d],x);
        if(pri[son[p][d]]>pri[p])   rotate(p,d^1);
        push_up(p);
    }
}
void remove(int& p,int x)
{
    if(!p)  return;
    if(x==val[p])
    {
        if(cnt[p]>1)
        {
            cnt[p]--;
            push_up(p);
            return;
        }
        if(son[p][0]||son[p][1])
        {
            if(!son[p][1]||pri[son[p][0]]>pri[son[p][1]])
            {
                rotate(p,1);
                remove(son[p][1],x);
            }
            else
            {
                rotate(p,0);
                remove(son[p][0],x);
            }
            push_up(p);
        }
        else    p=0;
        return;
    }
    if(x<val[p])    remove(son[p][0],x);
    else    remove(son[p][1],x);
    push_up(p);
}
int get_rank(int id,int x)
{
    if(!id) return 1;
    if(x==val[id])  return siz[son[id][0]]+1;
    if(x<val[id])   return get_rank(son[id][0],x);
    return siz[son[id][0]]+cnt[id]+get_rank(son[id][1],x);
}
int get_val(int id,int x)
{
    if(!id) return INF;
    if(x<=siz[son[id][0]])  return get_val(son[id][0],x);
    if(x<=siz[son[id][0]]+cnt[id])  return val[id];
    return get_val(son[id][1],x-siz[son[id][0]]-cnt[id]);
}
int get_pre(int id,int x)
{
    if(!id) return -INF;
    if(val[id]<x)   return max(val[id],get_pre(son[id][1],x));
    return get_pre(son[id][0],x);
}
int get_next(int id,int x)
{
    if(!id) return INF;
    if(val[id]>x)   return min(val[id],get_next(son[id][0],x));
    return get_next(son[id][1],x);
}
int main()
{
    bulid();
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    while(n--)
    {
        cin>>op>>x;
        if(op==1)   insert(root,x);
        if(op==2)   remove(root,x);
        if(op==3)   cout<<get_rank(root,x)-1<<'\n';
        if(op==4)   cout<<get_val(root,x+1)<<'\n';
        if(op==5)   cout<<get_pre(root,x)<<'\n';
        if(op==6)   cout<<get_next(root,x)<<'\n';
    }
    return 0;
}
2024/12/20 09:15
加载中...