给定一棵具有与每个节点和Q查询关联的颜色的N元树。每个查询包含两个整数A和X。任务是对以A为根的子树中的所有不同颜色进行计数,该子树中的颜色频率大于或等于该子树中的X。
例子:
Input: Tree:
query[] = {{1, 2}, {1, 3}, {1, 4}, {2, 3}, {5, 3}}
Output: {2, 2, 1, 0, 1}
Explanation:
In the subtree rooted at 1, the frequency of colour 2 is 3 and colour 3 is 4. So the answer is 2 for the 1 query, 2 for 2nd query and 1 for 3rd query.
For subtree rooted at 2, frequency of color 2 is 2 and color 3 is 1. So no color have frequency more than or equal to 4.
For subtree rooted at 5, frequency of color 2 is 1 and color 3 is 3. So color 3 have frequency equal to 3.
天真的方法
- 对于每个查询,我们将遍历给定节点的整个子树。
- 我们将维护一个映射,该映射将每种颜色的频率存储在给定节点的子树中。
- 然后,遍历贴图并计算颜色数,以使其频率大于给定的x。
时间复杂度: O(Q * N)
空间复杂度: O(Q * N)
方法:(使用莫氏算法)
- 我们将首先使用Euler Tour将树弄平。
- 我们将把数字分配给每个节点,何时将其放入DFS中以及何时该节点出来。让我们用tin [node]和tout [node]表示每个节点。
- 将树展平为数组后,的每个子树都可以表示为某个数组,其开始和结束索引分别为tin [node]和tout [node] 。
- 现在,问题变成了某些子阵列中频率大于X的元素数量。
- 我们将使用Mo的算法来解决此问题。
- 首先,我们将存储查询并根据tin [node] / SQ对其进行排序,其中SQ是N的平方根。
- 当我们移动指针时,我们将在第i个颜色处将频率存储在数组中,并将查询的答案存储在数组的第X个位置,因为它存储的频率等于X的颜色计数。
输出:
时间复杂度:
空间复杂度: