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