splay 板子 28pts 求调
查看原帖
splay 板子 28pts 求调
535996
Blanc_min楼主2024/10/25 20:56
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define _ 500005
ll n,rt,siz;
struct Splay {
    #define ls(x) tr[x].son[0]
    #define rs(x) tr[x].son[1]
    #define fa(x) tr[x].fa
    struct point {ll son[2],fa,siz,num,w;}tr[_];
    ll tot;
    void pushup(ll x) {tr[x].siz=tr[ls(x)].siz+tr[rs(x)].siz+tr[x].num;}
    ll check(ll x) {return tr[fa(x)].son[1]==x;}
    void rotate(ll x) {
        ll fa=fa(x),ffa=fa(fa),op=check(x);
        if(ffa) tr[ffa].son[check(fa)]=x;tr[x].fa=ffa;
        tr[fa].son[op]=tr[x].son[op^1];
        if(tr[x].son[op^1]) tr[tr[x].son[op^1]].fa=fa;
        tr[fa].fa=x;tr[x].son[op^1]=fa;
        pushup(fa),pushup(x);
    }
    void splay(ll x,ll goal) {
        while(fa(x)!=goal) {
            ll fa=fa(x);
            if(fa(fa)!=goal) rotate((check(x)^check(fa))?fa:x);
            rotate(x);
        }
        if(!goal) rt=x;
    }
    void add(ll &x,ll k,ll fa) {
        if(!x) {
            x=++tot;
            tr[x].num=1;
            tr[x].w=k;
            tr[x].fa=fa;
            splay(x,0);
            return ;
        }
        if(k==tr[x].w) {
            tr[x].num++;
            splay(x,0);
            return ;
        }
        if(tr[x].w<k) add(rs(x),k,x);
        if(tr[x].w>k) add(ls(x),k,x);
        pushup(x);
    }
    ll getranks(ll x,ll k) {
        if(!x) return 1;
        if(k>tr[x].w) return getranks(rs(x),k)+tr[x].num+tr[ls(x)].siz;
        if(k<=tr[x].w) return getranks(ls(x),k);
        return -1;
    }
    ll ranks(ll x,ll k) {
        if(!x) return 0;
        if(k-tr[ls(x)].siz<=tr[x].num&&k>tr[ls(x)].siz) {return tr[x].w;}
        if(k<=tr[ls(x)].siz) return ranks(ls(x),k);
        else return ranks(rs(x),k-tr[ls(x)].siz-tr[x].num);
    }
    ll get_pre(ll x,ll k,ll op) {
        ll ans=0;
        while(x) {
            if(tr[x].w<k) ans=x,x=rs(x);
            else x=ls(x);
        }
        if(op) return ans;
        else return tr[ans].w;
    }
    ll get_next(ll x,ll k,ll op) {
        ll ans=0;
        while(x) {
            if(tr[x].w>k) ans=x,x=ls(x);
            else x=rs(x);
        }
        if(op) return ans;
        else return tr[ans].w;
    }
    void del(ll k) {
        ll u1=get_pre(rt,k,1),u2=get_next(rt,k,1);
        splay(u1,0),splay(u2,u1);
        ll x=ls(u2);
        if(tr[x].num>1) {
            tr[x].num--;
            pushup(x),pushup(u2),pushup(u1);
            return ;
        }
        tr[x].num=0;
        tr[u2].son[0]=0,tr[x].fa=0;
        pushup(x),pushup(u2),pushup(u1);
    }
}tr;
int main() {
    freopen("P3369_5.in", "r", stdin);
    freopen("P3369.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    tr.add(rt,INT_MAX,0);
    tr.add(rt,INT_MIN,0);
    while(n--) {
        ll op,x;cin>>op>>x;
        if(op==1) tr.add(rt,x,0),siz++;
        if(op==2) tr.del(x),siz--;
        if(op==3) cout<<tr.getranks(rt,x)-1<<'\n';
        if(op==4) cout<<tr.ranks(rt,x+1)<<'\n';
        if(op==5) cout<<tr.get_pre(rt,x,0)<<'\n';
        if(op==6) cout<<tr.get_next(rt,x,0)<<'\n';
        // for(ll i=1;i<=siz;i++) cout<<tr.ranks(rt,i+1)<<' ';
        // cout<<endl;
    }
    return 0;
}
/*
4
1 10
1 30
1 20
3 21

3

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

106465
84185
492737

20
1 964673
5 968705
4 1
3 964673
5 965257
1 915269
1 53283
3 964673
3 53283
3 53283
1 162641
5 973984
1 948119
2 915269
2 53283
6 959161
1 531821
1 967521
2 531821
1 343410

964673
964673
1
964673
3
1
1
964673
964673
*/
2024/10/25 20:56
加载中...