树上启发式合并 (dsu on tree)】的更多相关文章

参考资料 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重儿子,只有重儿子子树的贡献保留,所以可以保…
这个故事告诉我们,在做一个辣鸡出题人的比赛之前,最好先看看他发明了什么新姿势= =居然直接出了道裸题 参考链接: http://codeforces.com/blog/entry/44351(原文) http://blog.csdn.net/QAQ__QAQ/article/details/53455462 这种技巧可以在O(nlogn)的时间内解决绝大多数的无修改子树询问问题. 例1 子树颜色统计 有一棵n个点的有根树,根为1,每个点有一个1~n的颜色,对于每一个点给了一个数k,要询问这个子树…
题目链接 题目大意:给出一颗含有$n$个结点的树,每个节点有一个颜色.求树中每个子树最多的颜色的编号和. ------------------------- 树上启发式合并(dsu on tree). 我们先考虑暴力怎么做.遍历整颗树,暴力枚举子树然后用桶维护颜色个数.这样做是$O(n^2)$的,显然会T.我们需要一种更快的算法:树上启发式合并. 关于启发式算法的介绍,详见OI Wiki.本文只介绍树上启发式合并算法.本题的解法: 每处理完一颗子树,我们都要把桶清空一次,以免对它的兄弟造成影响.…
近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数)的不二法宝.它不仅好想好写,还有着\(O(nlogn)\)的优秀时间复杂度(划重点). 结合一道例题来讲吧: CF600E Lomsat gelral 题目大意: 一棵树有\(n(n\leqslant 10^5)\)个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和…
有丶难,学到自闭 参考的文章: zcysky:[学习笔记]dsu on tree Arpa:[Tutorial] Sack (dsu on tree) 先康一康模板题吧:CF 600E($Lomsat$ $gelral$) 虽然已经用莫队搞过一遍了(可以参考之前写的博客~),但这个还是差距挺大 我们如果对于每个节点暴力统计答案,是$O(N^2)$的复杂度:最坏情况下整棵树是一条链,对于每个节点的统计平均下来是$O(N)$的 具体是怎么做的呢? 对于以当前节点$x$为根的子树,我们建立$cnt$和…
一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1.前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有儿子中拥有最多子树的儿子 轻儿子 一个结点的所有儿子中不是重儿子的儿子 重边 父亲与重儿子的连边 轻边 父亲与轻儿子的连边 重链 一堆重边连接而成的链 轻链 一堆轻边连接而成的链 2.什么是 dsu on tree(树上启发式合并) ? dsu on tree 其实就是个优雅的暴力算法,和它一起共被…
(这题在洛谷主站居然搜不到--还是在百度上偶然看到的) 题目描述 给一棵根为1的树,每次询问子树颜色种类数 输入输出格式 输入格式: 第一行一个整数n,表示树的结点数 接下来n-1行,每行一条边 接下来一行n个数,表示每个结点的颜色c[i] 接下来一个数m,表示询问数 接下来m行表示询问的子树 输出格式: 对于每个询问,输出该子树颜色数 说明 对于前三组数据,1<=m,c[i]<=n<=100 1<=m,c[i]<=n<=1e5 本来在学树上启发式合并,偶然看到这个题,…
题目描述 一棵根为\(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\))…