DSU on tree 树上启发式合并
DSU on Tree 树上启发式合并
树上启发式合并是一种非常常用来处理有关于子树内一些有关于 “次数”,“路径异或”之类的问题,虽然算法本身比较困难,但是学会理解了模板就非常简单了。
树上启发式合并,专门用来处理有关于次数的问题,需要维护的信息很多,例如
说到处理次数的问题,而且是在一棵树上,可以发现这非常困难,于是首先想到的就是暴力求解,对于每一棵子树中,每次进行枚举进行统计答案,这样子每次计算一边的时间复杂度就是
我们来分析暴力的过程,先对一个父节点
所以每次我们进行 DSU 操作时,不去清空这个重儿子,就会使得时间复杂度提升,看上去好像没有优化,但是经过仔细证明后可以得出,其实时间复杂度是
例题:
-
CF600E
题目意思非常简单,给定每一个节点的颜色,要求求出对于每一个节点的子树,其中出现次数最多颜色的编号之和。
看到出现的次数且是在一棵树上,很容易想到使用 DSU 求解,所以用这道题来演示 DSU 模板的写法:
https://codeforces.com/contest/600/submission/332590072
-
CF375D
题目意思基本上和上题一样,其实处理的思路也是差不多一样的,不过两题的不同点在于一个题目求得是出现最多次数的颜色编号之和,另一个则是求出出现次数
同样使用 clear_ans 数组变换答案时进行处理即可。
注意本题有多次询问,所以无法直接处理,不妨把每一个询问离线,然后挂到每一个节点上去询问,接着处理答案直接最后输出即可。
https://codeforces.com/contest/375/submission/332591162
-
CF246E
这题不一样,不过还是一个 DSU 的板子题,给定每一个节点的父亲节点和其名字,要求
看上去很难做,其实仔细想想,还是有关于统计次数的问题,只是多了一个字符串的限制,和
https://codeforces.com/contest/246/submission/332593867
-
CF208E
这是一道很有训练价值的 DSU 题,稍微比前一题略难,不应该是蓝。
定义
看到了次数想到了树上启发式合并,但是由于是
https://codeforces.com/contest/208/submission/332598595
-
回文字符类启发式合并
-
CF570D
首先分析题目,每次询问
考虑回文串的性质,很容易知道重排后能组成回文串的必要条件是所有字母的出现次数为奇数的个数需要不超过
https://codeforces.com/contest/570/submission/332603145
-
CF741D
此题为上一题扩展,CF 2900 不止紫。
思路主要的想法来自与 CF570D,重排后能组成回文串的必要条件是所有字母的出现次数为奇数的个数需要不超过
https://codeforces.com/contest/741/submission/332611183