可离线处理子树相关信息统计的算法,时间复杂度 $O(n\log n)$,空间复杂度 $O(n)$。
首先发现对每棵子树进行信息统计时,只需要合并所有儿子节点所在子树信息,最后加上该节点本身信息即可。
考虑信息合并的过程,类比并查集的启发式合并,发现把节点数少的子树信息合并到节点数多的子树将得到更优复杂度。
于是考虑保留重儿子子树的统计信息,然后暴力遍历轻儿子子树,合并结果。
具体实现为先 $\text{dfs}$ 处理轻儿子子树的询问,再删除轻儿子子树的统计信息(否则空间复杂度难以承受)。
然后处理重儿子子树的询问,但保留重儿子子树的统计信息,最后再次遍历轻儿子子树,然后把信息暴力合并。
关于时间复杂度,发现某个节点每被额外统计一次当且仅当他每有一个祖先节点为轻儿子。
由于每个节点到根节点最多有 $O(\log n)$ 条轻边,于是每个节点最多被统计 $O(\log n)$ 次,于是总时间复杂度为 $O(n\log n)$。
给定一个以 $1$ 为根的 $n$ 个节点的树,每个点上有一个小写英文字母。每个点的深度定义为该节点到 $1$ 号节点路径上的点数。
每次询问 $a,b$,查询以 $a$ 为根的子树内深度为 $b$ 的节点上的字母重新排列之后是否能构成回文串。
考虑字符串排序后能构成回文串的条件,发现只要出现字符串中出现奇数次的字符不超过一种就行。
于是只需要维护每个节点子树的每个深度的每种字符个数就行了。
ps. 字母总共就 $26$ 种,考虑状压异或,然后根据 $dfs$ 序建立 $n$ 棵线段树维护深度为 $1\sim n$ 的节点可以实现在线查找。
给定一个以 $1$ 为根的 $n$ 个节点的树,每个结点都有一种颜色。
求每个节点所在子树种数量最多的颜色(如果有多个满足条件的颜色则将所有颜色编号相加)。
给定一个以 $1$ 为根的 $n$ 个节点的树,定义 $d(u,x)$ 为 $u$ 的子树中到 $u$ 距离为 $x$ 的节点数。
对于每个点,求一个最小的 $k$,使得 $d(u,k)$ 最大。