由于按秩合并并不会影响正确性而只影响效率,所以有些题解处理地不太恰当,其实是错的
我就举个例子,比如第三篇pengym的题解
有这样一句话
merge(root[i-1],root[i],1,n,fa[posx],fa[posy]);
if(dep[posx]==dep[posy])update(root[i],1,n,fa[posy]);
而他的update函数是这样实现的
void update(int rt,int l,int r,int pos)
{
if(l==r){dep[rt]++;return ;}
if(pos<=Mid)update(lson,pos);
else update(rson,pos);
}
没有新建节点。他说是不需用到中间版本的信息,其实关键不在这里。这个写法不能保证在merge之后到fa[posy]的路径已经新建,那么这样改dep可能会影响到原来的版本,即修改了原版本,这样其实是很有问题的。
应该是这样的把