求助无旋Treap

P3391 【模板】文艺平衡树

SuperCowHorse @ 2022-08-26 20:15:48

RT,第44行总是报错不知道为什么。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,Q,rt;
int tot,ch[maxn][2],siz[maxn],val[maxn],wei[maxn];
bool tag[maxn];
void pushdown(int p){
    swap(ch[p][0],ch[p][1]);
    if(ch[p][0]) tag[ch[p][0]]^=1;
    if(ch[p][1]) tag[ch[p][1]]^=1;
    tag[p]=0;
}
int newnode(int v){
    wei[++tot]=rand();
    val[tot]=v;
    siz[tot]=1;
    return tot;
}
void pushup(int x){siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;}
int merge(int x,int y){
    if(!x||!y) return x|y;
    if(wei[x]<wei[y]){
        if(tag[x]) pushdown(x);
        ch[x][1]=merge(ch[x][1],y);
        pushup(x);
        return x;
    }
    else{
        if(tag[y]) pushdown(y);
        ch[y][0]=merge(x,ch[y][0]);
        pushup(y);
        return y;
    }
}
void split(int p,int v,int &x,int &y){
    if(!p){x=y=0;return;}
    if(tag[p]) pushdown(p);
    if(siz[ch[p][0]]+1<=v){
        x=p;
        split(ch[p][1],v-siz[ch[p][0]]-1,ch[p][1],y);
    }
    else{
        y=p;
        split(ch[p][0],v,x,ch[p][0]);//here
    }
    pushup(p);
}
void print(int p){
    if(!p) return;
    if(tag[p]) pushdown(p);
    if(ch[p][0]) print(ch[p][0]);
    printf("%d ",val[p]);
    if(ch[p][1]) print(ch[p][1]);
}
signed main(){
    scanf("%d%d",&n,&Q);
    for(int i=1;i<=n;++i)
        rt=merge(rt,newnode(i));
    while(Q--){
        int l,r,x,y,z;
        scanf("%d%d",&l,&r);
        split(rt,r,x,z);
        split(rt,l-1,x,y);
        tag[y]^=1;
        rt=merge(merge(x,y),z);
    }
    print(rt);
    return 0;
}

by Retr @ 2022-08-26 20:30:31

是编译报错吗?我这边复制到vscode编译没问题


by SuperCowHorse @ 2022-08-26 20:31:08

@Retr 不是,运行后没输出,调试弹出CPU窗口


by SuperCowHorse @ 2022-08-26 20:31:25

@Retr 编译没问题


by Retr @ 2022-08-26 20:31:36

不过好像哪里写炸了,我将您代码交了一发貌似死循环了


by 显微镜 @ 2022-08-26 20:33:15

@chenye3 感觉是这导致的吧

int l,r,x,y,z;
scanf("%d%d",&l,&r);
split(rt,r,x,z);
split(rt,l-1,x,y);   //rt?x?

by SuperCowHorse @ 2022-08-26 20:34:19

@显微镜 dalao什么意思啊


by SuperCowHorse @ 2022-08-26 20:35:06

为啥把rt改x就AC了啊


by 显微镜 @ 2022-08-26 20:36:34

你第一次split,把原树分到了x,z为根的两个树里,第二次当然要split那个x而不是原来的根rt


by SuperCowHorse @ 2022-08-26 20:37:14

哦,谢谢dalao,orz


|