带权并查集——简单动态树维护深度
6273. 欠钱
带权并查集维护深度
int find(int x){
if(fa[x]==x) return x;
int dad=find(fa[x]);
dep[x]+=dep[fa[x]],fa[x]=dad;
return dad;
}
初始深度为0,连接中的儿子设为1
原理是还未更新时深度一直为1,而更新后就连着深度为0的根,故连接时无影响
然后用类似记忆化的法方维护lca的倍增数组
void update(int x,int i){
if(f[x][i]||!x||!i) return ;
update(x,i-1),update(f[x][i-1],i-1);
f[x][i]=f[f[x][i-1]][i-1],mix[x][i]=min(mix[x][i-1],mix[f[x][i-1]][i-1]);
}
然后就能优雅log解决简单的一些简单的动态树问题