求助

P6136 【模板】普通平衡树(数据加强版)

BFqwq @ 2020-02-27 14:11:24

RT,普通版过了加强版WA 7个点

写的是红黑树

#include <bits/stdc++.h>
using namespace std;
inline int read(){
    register int x=0;
    register bool f=0;
    register char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<3)+(x<<1)+c-48;
        c=getchar();
    }
    return f?-x:x;
}
char cr[200];int tt;
inline void print(int x,char k='\n') {
    if(!x) putchar('0');
    if(x < 0) putchar('-'),x=-x;
    while(x) cr[++tt]=x%10+'0',x/=10;
    while(tt) putchar(cr[tt--]);
    putchar(k);
}
const int inf=2147483647;
const int maxn=1100100;
struct rbt{
    int v,sz,cnt;
    bool col;
    int fa,ch[2];
}t[maxn*4];
int st[maxn*4],top,rt,tot,n,m,ans,lastans;
void pushup(int o){
    t[o].sz=t[t[o].ch[0]].sz+t[t[o].ch[1]].sz+t[o].cnt;
}
bool get(int o){
    return t[t[o].fa].ch[1]==o;
}
int newnode(int v){
    int o=top?st[top--]:++tot;
    t[o]=(rbt){v,1,1,1,0,0,0};
    return o;
}
void rotate(int o,bool c){
    int s1=t[o].ch[!c];
    t[o].ch[!c]=t[s1].ch[c];
    if (t[s1].ch[c])
        t[t[s1].ch[c]].fa=o;
    t[s1].fa=t[o].fa;
    if(!t[o].fa)
        rt=s1;
    else 
        t[t[o].fa].ch[get(o)]=s1;
    t[s1].ch[c]=o;
    t[o].fa=s1;
    pushup(o);
    pushup(s1);
}
void ins_fix(int o) {
    while(t[t[o].fa].col){
        int f=t[o].fa,gf=t[f].fa;
        bool wh=!get(f);
        int ul=t[gf].ch[wh];
        if(t[ul].col) {
            t[f].col=t[ul].col=0;
            t[gf].col=1;
            o=gf;
        }
        else{
            if(o==t[f].ch[wh])
                rotate(o=f,!wh);
            else{
                t[gf].col=1;
                t[f].col=0;
                rotate(gf,wh);
            }
        }
    }
    t[rt].col=0;
}
void ins(int v) {
    int o=rt,f=0;
    while(o){
        t[o].sz++,f=o;    
        if(v==t[o].v){
            t[o].cnt++;
            return;
        }
        o=t[o].ch[v>t[o].v];
    }
    o=newnode(v);
    if(f) t[f].ch[v>t[f].v]=o;
    else rt=o;
    t[o].fa=f;
    ins_fix(o);
}
int kth(int k) {
    int tmp;
    int o=rt;
    for (;o;) {
        tmp=t[t[o].ch[0]].sz;
        if (tmp+1<=k&&k<=tmp+t[o].cnt)
            break;
        else{
            if (k<=tmp)
                o=t[o].ch[0];
            else{
                k-=tmp+t[o].cnt;
                o=t[o].ch[1];
            }
        }
    }
    return t[o].v;
}
void update(int o){
    for(int i=o;i;i=t[i].fa){
        t[i].sz--;
    }
}
void del_fix(int o) {
    while(o!=rt&&!t[o].col) {
        bool wh=!get(o);
        int f=t[o].fa,ul=t[f].ch[wh];
        if(t[ul].col){
            t[ul].col=0;
            t[f].col=1;
            rotate(f,!wh);
            ul=t[f].ch[wh];
        }
        else{
            if(!t[t[ul].ch[0]].col&&!t[t[ul].ch[1]].col){
                t[ul].col=1;
                o=f;
            }
            else{
                if(!t[t[ul].ch[wh]].col){
                    t[t[ul].ch[!wh]].col=0;
                    t[ul].col=1;
                    rotate(ul,wh);
                    ul=t[f].ch[wh];
                }
                t[ul].col=t[f].col;
                t[t[ul].ch[wh]].col=t[f].col=0;
                rotate(f,!wh);
                break;
            }
        }
    }
    t[o].col=0;
}
void del(int v) {
    int o=rt;
    while(o&&t[o].v!=v){
        o=t[o].ch[t[o].v<v];
    }
    if(!o)return;
    if(t[o].cnt>1) {        
        t[o].cnt--;
        update(o);
        return;
    }
    int d=o,g=0;
    if(t[o].ch[0]&&t[o].ch[1]){
        d=t[o].ch[1];
        while(t[d].ch[0])
            d=t[d].ch[0];
    }
    g=t[d].ch[!t[d].ch[0]];
    t[g].fa=t[d].fa;
    if(!t[d].fa)
        rt=g;
    else t[t[d].fa].ch[get(d)]=g;
    if(o!=d){
        t[o].v=t[d].v;
        t[o].cnt=t[d].cnt;
    }
    update(t[d].fa);
    for(int i=t[d].fa;i&&t[d].cnt>1&&i!=o;i=t[i].fa){
        t[i].sz-=t[d].cnt;
        t[i].sz++;
    }
    if (!t[d].col) del_fix(g);
    st[++top]=d;
}
int rnk(int v) {
    int tmp,sum=0;
    int o=rt;
    for (;o;) {
        tmp=t[t[o].ch[0]].sz;
        if(v==t[o].v)
            break;
        else{
            if(v<t[o].v)
                o=t[o].ch[0];
            else{
                sum+=tmp+t[o].cnt,
                o=t[o].ch[1];
            }
        }
    }
    return sum+tmp+1;
}
int suf(int v) {
    int res=inf;
    int o=rt;
    for(;o;){
        if(t[o].v>v){
            res=t[o].v,
            o=t[o].ch[0];
        }
        else 
            o=t[o].ch[1];
    }
    return res;
}
int pre(int v) {
    int res=-inf;
    int o=rt;
    for(;o;){
        if(t[o].v<v){
            res=t[o].v,o=t[o].ch[1];
        }
        else
            o=t[o].ch[0];
    }
    return res;
}
signed main(){
    n=read();m=read();
    for(int i=1;i<=n;i++){
        int a=read();
        ins(a);
    }
    while(m--){
        int opt=read(),v=read()^lastans;
        if(opt==1) ins(v);
        if(opt==2) del(v);
        if(opt==3) lastans=rnk(v);
        if(opt==4) lastans=kth(v);
        if(opt==5) lastans=pre(v);
        if(opt==6) lastans=suf(v);
        if(opt!=1&&opt!=2)ans^=lastans;
    }
    print(ans);
    return 0;
}

by serverkiller @ 2020-02-27 14:12:12

%%%


by BFqwq @ 2020-02-27 14:13:08

@serverkiller 大佬能救我吗


by serverkiller @ 2020-02-27 14:13:57

@世界第一肥宅BF 我太菜了(


by ZeyuJin_Yuki @ 2020-02-27 14:14:21

\operatorname{Orz}$ 神仙 $\operatorname{bian}feng

by 血色黄昏 @ 2020-02-27 14:24:08

%%%


by mrsrz @ 2020-02-27 14:30:52

@世界第一肥宅BF 写挂了,自己调


by liumuxin @ 2020-02-27 15:11:36

orz BF 三分钟手写红黑树 %%%


|