难以描述的玄学错误求助
  • 板块学术版
  • 楼主fangzichang
  • 当前回复13
  • 已保存回复13
  • 发布时间2023/6/13 11:14
  • 上次更新2023/10/23 13:14:38
查看原帖
难以描述的玄学错误求助
678087
fangzichang楼主2023/6/13 11:14

rt。
今天写一道线段树分治套动开李超树的时候,出现了如下玄学现象。
编译命令-O2 -std=c++11 -Wall。
核心代码:

int cnt=0
int build(int l,int r){
	cnt++;
	a.pb({ln[0],l,r,0,0});
	return cnt;
}
.....
void insert(int x,line f,int l,int r){
	......
	if(!a[x].lc){
		build(a[x].l,mid);
		a[x].lc=cnt;
		//cout<<"\tlc:"<<a[x].lc<<" cnt:"<<cnt<<endl;
	}
	insert(a[x].lc,f,l,r);
	if(!a[x].rc){
		build(mid+1,a[x].r);
		a[x].rc=cnt;				
	}
	insert(a[x].rc,f,l,r);
}   

这部分代码得到正确答案,但是,若直接把左右孩子赋值为build函数的返回值:

int cnt=0
int build(int l,int r){
	cnt++;
	a.pb({ln[0],l,r,0,0});
	return cnt;
}
.....
void insert(int x,line f,int l,int r){
	......
	if(!a[x].lc){
		a[x].lc=build(a[x].l,mid);
		//cout<<"\tlc:"<<a[x].lc<<" cnt:"<<cnt<<endl;
	}
	insert(a[x].lc,f,l,r);
	if(!a[x].rc){
		a[x].rc=build(mid+1,a[x].r);			
	}
	insert(a[x].rc,f,l,r);
}   

则出现WA,输出调试信息(上面的注释)发现有时候一些儿子被赋值为0。
然后发现如果先定义一个变量赋值为build的返回值,再用它赋值给左右儿子,则结果正常,否则会出现儿子被赋值为0,所以这是什么现象(害我调了一天半……
完整代码与数据生成器

代码想看就看罢,那个调试信息没注释,其他都注释了。

2023/6/13 11:14
加载中...