MnZn初学fhq,有T有WA 求调

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

Jie_Rans @ 2022-04-28 21:58:04

#include<bits/stdc++.h>
using namespace std;
int read()  
{  
    int s = 0, f = 1;  
    char ch = getchar();  
    while(!isdigit(ch)) {  
        if(ch == '-') f = -1;  
        ch = getchar();  
    }  
    while(isdigit(ch)) {  
        s = s * 10 + ch - '0';  
        ch = getchar();  
    }  
    return s * f;  
}  
const int N=2e6+10;
int n,m,a[N];
int root,tot,rt1,rt2,rt3,val[N],dat[N],size[N],ch[N][3];
void pushup(int x) {
    size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
}
void split(int id,int k,int &x,int &y) {
    if(!id)
        x=y=0;
    else {
        if(val[id]<=k) 
            x=id,split(ch[x][1],k,ch[x][1],y);
        else 
            y=id,split(ch[y][0],k,x,ch[y][0]);
        pushup(id);
    }
}
int merge(int x,int y) {
    if(!x || !y)
        return x+y;
    if(dat[x]<=dat[y]) {
        ch[x][1]=merge(ch[x][1],y);
        pushup(x);
        return x;
    }
    ch[y][0]=merge(x,ch[y][0]);
    pushup(y);
    return y;
}
int New_Node(int x) {
    val[++tot]=x;
    dat[tot]=rand();
    size[tot]=1;
    return tot;
}
int Val_query(int id,int x) {
    int now=id;
    while(now) {
        if(x<=size[ch[now][0]])
            now=ch[now][0];
        else if(x==size[ch[now][0]]+1) 
            return val[now];
        else 
            x-=size[ch[now][0]]+1,now=ch[now][1];
    }
}
int main()
{   
    freopen("exe.in","r",stdin);
    freopen("exe.out","w",stdout);
    srand(20051029 + 20051122);
    n=read(); m=read();
    for(int i=1;i<=n;i++){
        int x=read();
        split(root,x,rt1,rt2);
        root=merge(merge(rt1,New_Node(x)),rt2);
    }
    int last=0,ans=0;
    while(m--) {
        int op=read(),x=read();
        if(op==1) {
            split(root,x,rt1,rt2);
            root=merge(merge(rt1,New_Node(x)),rt2);
        }
        if(op==2) {
            split(root,x,rt1,rt2);
            split(rt1,x-1,rt1,rt3);
            rt3=merge(ch[rt3][0],ch[rt3][1]);
            root=merge(merge(rt1,rt3),rt2);
        }
        if(op==3) {
            x^=last;
            split(root,x,rt1,rt2);
            last=size[rt1]+1;
            ans^=last;
        }
        if(op==4) {
            x^=last;
            last=Val_query(root,x);
            ans^=last; 
        }
        if(op==5) {
            x^=last;
            split(root,x-1,rt1,rt2);
            last=Val_query(rt1,size[rt1]);
            ans^=last;
            root=merge(rt1,rt2);
        }
        if(op==6) {
            x^=last;
            split(root,x,rt1,rt2);
            last=Val_query(rt2,1);
            ans^=last;
            root=merge(rt1,rt2);
        }
    }
    printf("%d",ans);
    return 0;
}

by Terrible @ 2022-04-29 01:49:43

@Chengliangjie

        if(op==3) {
            x^=last;
            split(root,x,rt1,rt2);
            last=size[rt1]+1;
            ans^=last;
        }

split完没有merge,而且根据你写的split的实现,应该为 split(root,x-1,rt1,rt2);.

还有其他地方有误,TLE的原因可能是Val_query没有返回值,就是说now最后等于0了,这意味着还是有一些其他错误的。

我反正罢工了,睡觉去了,你干脆用你的弱化版的板子改改交上去吧。


|