Splay今又RE在OJ上
查看原帖
Splay今又RE在OJ上
651786
yyc_楼主2023/3/19 17:06
#include<bits/stdc++.h>
#define ls s[0]
#define rs s[1]
#define getdir(u,v) (t[v].rs == u)
#define setson(u,c,v) t[u].s[c] = v,t[v].p = u
using namespace std;
const int maxn = 1e5+10;
struct node { int val,siz,cnt,s[2],p; }t[maxn];
int n,m,x,cnt,rt,l,r,tmp; char opt;
void pushup(int u) { u[t].siz = u[t].ls[t].siz + u[t].rs[t].siz + 1; }
void rota(int x) {
    int y = t[x].p,z = t[y].p, c = getdir(x,y);
    setson(z,getdir(y,z),x);
    setson(y,c,t[x].s[!c]);
    setson(x,!c,y);
    pushup(y),pushup(x);
}
void splay(int x,int k) {
    while(t[x].p != k) {
        int y = t[x].p,z = t[y].p;
        if(z != k) rota(getdir(x,y)^getdir(y,z) ? x : y);
        rota(x);
    } if(!k) rt = x;
}
int geturk(int u,int k) {
    while(1) {
        int less = t[u].ls[t].siz;
        if(k <= less) u = t[u].ls;
        else if(k <= less + t[u].cnt) { splay(u,0); return u;}
        else k -= less + t[u].cnt,u = t[u].rs;
    }
}
int getuval(int u,int val) {
    while(u) {
        if(t[u].val == val) return u;
        pushdown(u);
        u = t[u].s[val > t[u].val];
    }
    assert(0);
}
int merge(int u,int v) {
    if(!u || !v) return u|v;
    int maxon = geturk(u,t[u].siz);
    splay(maxon,0);
    setson(rt,1,v);
    pushup(rt);
    return rt;
}
void delu(int u) {
    splay(u,0);
    if(t[rt].cnt > 1) --t[rt].cnt;
    else {
        rt = merge(t[rt].ls,t[rt].rs);
        t[rt].p = 0;
    }
}
int insert(int &u,int p,int val) {
    if(!u) {
        u = ++cnt;
        t[u].p = p;
        t[u].cnt = t[u].siz = 1;
        t[u].val = val;
        return u;
    }
    if(t[u].val == val) {
        ++t[u].cnt,++t[u].siz;
        return u;
    }
    int res = insert(t[u].s[t[u].val < val],u,val);
    pushup(u);
    return res;
}
void insert(int u,int val) { splay(insert(u,0,val),0); }
int getrk(int val) {
    int rk = 0,u = rt;
    while(u) {
        if(val == t[u].val) {
            rk += t[u].ls[t].siz;
            splay(u,0); return rk;
        }
        if(val < t[u].val) u = t[u].ls;
        else {
            rk += u[t].ls[t].siz + t[u].cnt;
            u = t[u].rs;
        }
    }
    return rk;
}
int getval(int u,int k) { int v = geturk(u,k); return t[v].val; }
void del(int u,int val) { int v = getuval(u,val); delu(v); }
signed main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n;
    while(n--) {
        cin>>opt>>x;
        switch(opt) {
            case '1': insert(rt,x);                         break;
            case '2': del(rt,x);                            break;
            case '3': cout<<getrk(x)+1<<'\n';               break;
            case '4': cout<<getval(rt,x)<<'\n';             break;
            case '5': 
                tmp = getrk(x); cout<<getval(rt,tmp)<<'\n';                 break;
            case '6': 
                tmp = getrk(x+1); cout<<getval(rt,tmp+1)<<'\n';
        }
    }
}

RE 6-10

2023/3/19 17:06
加载中...