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,所以这是什么现象(害我调了一天半……
完整代码与数据生成器
代码想看就看罢,那个调试信息没注释,其他都注释了。