浅谈树上启发式合并(dsu on tree)
创始人
2024-03-21 22:08:18
0

这就是一个优雅的暴力。

引入

我们来看一道题:

给出一棵树,每个节点都有一个颜色。

查询一棵树中以每个节点为根的子树中颜色种类的多少。

因为子树之间会互相影响,我们就只能对于每个节点求一次,这时候暴力的时间复杂度就是 O(N2)O(N^2)O(N2) 的。

我们可以用 dsuontreedsu\ on\ treedsu on tree 来达到 O(n⋅logn)O(n\cdot log_n)O(n⋅logn​) 的时间复杂度。

思路

我们先来看下暴力的代码:

void update(int x, int fa, int flag) {num[color[x]] += flag;if (num[color[x]] == 0 && flag == -1)cnt--;if (num[color[x]] == 1 && flag == 1)cnt++;for (int i = last[x]; i; i = E[i].next)if (E[i].to != fa)update(E[i].to, x, flag);
}
void dfs(int r, int fa) {// 求子树r中的信息, fa为r的父亲for (int i = last[r]; i; i = E[i].next) // 遍历r的邻接点if (E[i].to != fa)dfs(E[i].to, r);update(r, fa, 1);// updata就是用来求以r为根的子树的颜色种类个数ans[r] = cnt;update(r, fa, -1);// 清空数组
}

我们来想想如何优化

我们知道,一个节点可以由多个儿子的信息得来,但是儿子的答案又不能互相影响,于是我们就可以保留一个儿子的答案用到我们这个子树中。

为了更快,我们肯定是选择儿子中最大的那个来继承。

于是我们就可以得到代码。

void dfs(int x, int fa) {for (int i = last[x]; i; i = E[i].next)if (E[i].to != son[x] && E[i].to != fa) {dfs(E[i].to, x);// 我们先把除了需要继承的儿子的答案求出来update(tv, x, -1);// 因为不继承这个儿子,所以就清空数组}if (son[x])dfs(son[x], x);// 求出需要继承的儿子,此时就不清空数组num[color[x]]++;//注意!!!一定要加上自己这个节点!!!if (num[color[x]] == 1)cnt++;for (int i = last[x]; i; i = E[i].next){if (E[i].to != son[x] && E[i].to != fa)update(E[i].to, x, 1);//因为我们除了需要继承的儿子都没有加进答案里面,所以需要加入答案ans[x] = cnt;}
}

我们来分析一下时间复杂度。

因为这实际上很像树链剖分,于是我们就将轻边和重链引入进来。

我们可以发现,一个子树会被 updataupdataupdata 到的次数就是从该节点到根的路径中有多少轻边。

对于每个点,假设它和它的父亲的连边为轻边,则他的父亲的子树大小一定是该节点的两倍,所以可以证明一个节点到根的路径最多有 lognlog_nlogn​ 条轻边,所以每个节点最多被 updataupdataupdata 到 lognlog_nlogn​ 次,一共有 nnn 个点,所以时间复杂度就是 O(n⋅logn)O(n\cdot log_n)O(n⋅logn​) 。

相关内容

热门资讯

入库参考案例:深圳市某脉技术股... 深圳市某脉技术股份有限公司诉华某劳动合同纠纷案——用人单位以劳动者在临近下班时间之际离开工位属于严重...
普莱得:公司钉枪产品用于家具制... 投资者提问:最近美特机械生产的C型钉枪卖爆了,都卖断货了。请问贵司有生产同类型的产品吗?董秘回答(普...
6月份债券型基金接近普涨 金鹰... 中国经济网北京7月3日讯(记者 康博) 今年6月份,剔除净值异动的债基后,在有可比业绩的7148只(...
十三届省委第七轮巡视完成反馈   根据省委统一部署,十三届省委第七轮巡视反馈工作近日全部完成。12个省委巡视组分别向本轮巡视的24...
不用空调的夏天?通辽“绿色纳凉... 编辑制作/乌英嘎 图片/连振 张胜军 刘克强等 校对/杨慧玲一审/刘宇琪 二审/田川终审/斯琴塔娜
科技“点金”,吐蕃王冠重现光彩 转自:科创中国“即便现在来看,王冠依旧很惊艳。”青海省海西州民族博物馆馆长朱有振近日接受采访时告诉科...
佛塑科技:2025年6月30日... 投资者提问:最新股东人数董秘回答(佛塑科技SZ000973):您好!2025年6月30日公司股东人数...
“银龄”学员迎来毕业季   日前,新疆老年开放大学的“银龄”学员迎来了毕业时刻。一场以“石榴花开·同心筑梦”为主题的毕业典礼...
今年第3号台风“木恩”在西北太... 转自:北京日报客户端今年第3号台风“木恩”(热带风暴级;英文名称:Mun;名字来源:密克罗尼西亚;名...
重温入党誓词 践行初心使命 图为伦珠孜村党员重温入党誓词。姜文婷 本报记者 袁海霞 摄 为热烈庆祝中国共产党成立104周年,7月...