带权并查集——简单动态树维护深度

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解决简单的一些简单的动态树问题

posted @ 2024-02-22 20:50  zhy_learn  阅读(57)  评论(0)    收藏  举报