近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数)的不二法宝.它不仅好想好写,还有着\(O(nlogn)\)的优秀时间复杂度(划重点). 结合一道例题来讲吧: CF600E Lomsat gelral 题目大意: 一棵树有\(n(n\leqslant 10^5)\)个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和…
一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1.前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有儿子中拥有最多子树的儿子 轻儿子 一个结点的所有儿子中不是重儿子的儿子 重边 父亲与重儿子的连边 轻边 父亲与轻儿子的连边 重链 一堆重边连接而成的链 轻链 一堆轻边连接而成的链 2.什么是 dsu on tree(树上启发式合并) ? dsu on tree 其实就是个优雅的暴力算法,和它一起共被…
dsu on tree 本质上是一个 启发式合并 复杂度 \(O(n\log n)\) 不支持修改 只能支持子树统计 不能支持链上统计- 先跑一遍树剖的dfs1 搞出来轻重儿子- 求每个节点的子树上有多少颜色为k的节点 有一个朴素的\(N^2\)暴力做法- 每个点来个\(dfs\) 没了 好您会dfs序 主席树/莫队 您赢了?但是并没有dsu on tree 好打.. 每次加入 \(x\) 点的时候 考虑暴力将 \(x\) 的子树放入 然后取出 消除贡献- 所以先统计轻儿子 然后再统计重儿子 最…
简介 对于一颗静态树,O(nlogn)时间内处理子树的统计问题.是一种优雅的暴力. 算法思想 很显然,朴素做法下,对于每颗子树对其进行统计的时间复杂度是平方级别的.考虑对树进行一个重链剖分.虽然都基于重链剖分,但不同于树剖,我们维护的不是树链. 对于每个节点,我们先处理其轻儿子所在子树,轻子树在处理完后消除其影响.然后处理重儿子所在子树,保留其贡献.然后再暴力跑该点的轻子树,统计该点子树的最终答案.如果该点子树是轻子树,则消除该子树的影响,否则保留.用代码描述的话,大概是这个流程: void d…
有丶难,学到自闭 参考的文章: zcysky:[学习笔记]dsu on tree Arpa:[Tutorial] Sack (dsu on tree) 先康一康模板题吧:CF 600E($Lomsat$ $gelral$) 虽然已经用莫队搞过一遍了(可以参考之前写的博客~),但这个还是差距挺大 我们如果对于每个节点暴力统计答案,是$O(N^2)$的复杂度:最坏情况下整棵树是一条链,对于每个节点的统计平均下来是$O(N)$的 具体是怎么做的呢? 对于以当前节点$x$为根的子树,我们建立$cnt$和…
(这题在洛谷主站居然搜不到--还是在百度上偶然看到的) 题目描述 给一棵根为1的树,每次询问子树颜色种类数 输入输出格式 输入格式: 第一行一个整数n,表示树的结点数 接下来n-1行,每行一条边 接下来一行n个数,表示每个结点的颜色c[i] 接下来一个数m,表示询问数 接下来m行表示询问的子树 输出格式: 对于每个询问,输出该子树颜色数 说明 对于前三组数据,1<=m,c[i]<=n<=100 1<=m,c[i]<=n<=1e5 本来在学树上启发式合并,偶然看到这个题,…
参考资料 https://www.cnblogs.com/zhoushuyu/p/9069164.html https://www.cnblogs.com/candy99/p/dsuontree.html https://www.cnblogs.com/zcysky/p/6822395.html 简介 树上启发式合并 用到了heavy−light decomposition树链剖分 把轻边子树的信息合并到重链上的点里 因为每次都是先dfs轻儿子再dfs重儿子,只有重儿子子树的贡献保留,所以可以保…
题目描述 一棵根为\(1\) 的树,每条边上有一个字符(\(a-v\)共\(22\)种). 一条简单路径被称为\(Dokhtar-kosh\)当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求每个子树中最长的\(Dokhtar-kosh\)路径的长度. 输入输出样例 输入 #1 4 1 s 2 a 3 s 输出 #1 3 1 1 0 输入 #2 5 1 a 2 h 1 a 4 h 输出 #2 4 1 0 1 0 分析 一道树上启发式合并的好题 首先,我们来考虑什么样的情况下路径上的字符重…
树上启发式合并属于暴力的优化,复杂度O(nlogn) 主要解决的问题特点在于: 1.对于树上的某些信息进行查询 2.一般问题的解决不包含对树的修改,所有答案可以离线解决 算法思路:这类问题的特点在于父节点的信息是通过子节点更新而来 所以如果是暴力解决的话就是对每一个节点往下跑一次图,复杂度在O(n^2) 因为父节点是有子节点跟新而来,所以我们可以考虑每次保留一部分子节点的信息,将另一部分子节点信息暴力合并得到父节点的信息 这样的话我们就考虑保留重子节点的信息(子树中子节点数最多的节点),这样我们…
hdu6191 题意 给你一棵带点权的树,每次查询 \(u\) 和 \(x\) ,求以 \(u\) 为根结点的子树上的结点与 \(x\) 异或后最大的结果. 分析 看到子树,直接上树上启发式合并,看到异或,上 \(Trie\) . 这道题就是两个经典的题目结合了一波. 树上启发式合并处理这种需要查询整个子树的题目尤其有用,可以复用大量的信息. 离线查询后,到要查询的结点直接在 \(Trie\) \(01\) 树上跑一下即可. 先去理解一波 树上启发式合并(\(dsu \ on \ tree\))…