dsu on tree

树上启发式合并

大概步骤

  1. 求出重儿子
  2. 先递归处理轻儿子,不保留影响,最后处理重儿子,并保留影响
  3. 统计当前节点答案时,只处理轻儿子

CF600E Lomsat gelral

题意:求出每个点的子树内出现次数最多的颜色的编号和

很板的一题,求完重儿子后直接,递归处理轻儿子,把颜色出现次数给清空,防止互相影响
随后再处理递归重儿子,不清空颜色出现次数,因为在后面计算当前节点的答案时不必再次
遍历一遍重儿子的子树,可以把时间复杂度从\(O(n^2)\)->\(O(nlogn)\)

code

CF570D Tree Requests

题意:给定一个棵树,每次询问a,b,要求a的子树中深度为b的结点上的字母重新排列之后是否能构成回文串。

很轻易的可以想到由于你可以随便排列字母,所以想要组成回文串肯定是形如aaabaaa或aaaaaa的字符串
即要求数量为奇数的字母小于<=1
设cnt[d][c] 为深度为d时字母c出现的次数,最后直接check即可
由于这个深度在每个询问中被限制在了子树内,所以我们要变递归边去加这个cnt,
这时候就可以使用dsu on tree快速地处理

code

posted @ 2024-10-04 23:01  tobylhy  阅读(19)  评论(0)    收藏  举报