请看一下你的线段树最后处理时,在叶子处是否撤销了添加的线段。
错误代码:(0分)
void Upd(int p){
for(auto i:tr[p].ls){
if(!dsu.check(eg[i].fi,eg[i].se)){
for(auto j:tr[p].ls){
if(i==j) break;
dsu.Back();
}
return ;
}
dsu.Union(eg[i].fi,eg[i].se);
}
if(tr[p].l==tr[p].r){
ans[tr[p].l]=1;
return ;
}
Upd(lc(p));
Upd(rc(p));
for(auto i:tr[p].ls){
dsu.Back();
}
}
正确代码:(100分)
void Upd(int p){
for(auto i:tr[p].ls){
if(!dsu.check(eg[i].fi,eg[i].se)){
for(auto j:tr[p].ls){
if(i==j) break;
dsu.Back();
}
return ;
}
dsu.Union(eg[i].fi,eg[i].se);
}
if(tr[p].l==tr[p].r){
ans[tr[p].l]=1;
for(auto i:tr[p].ls){
dsu.Back();
}
return ;
}
Upd(lc(p));
Upd(rc(p));
for(auto i:tr[p].ls){
dsu.Back();
}
}