给定一个以1 为根的 N 元树,一个数组val[]由分配给每个节点的权重组成,以及一个矩阵Q[][] ,由形式为{X, D}的查询组成,每个查询的任务是找到分配给与节点 X 最大距离为 D的节点的所有权重中的最小值。
例子:
Input: Q[][] = {{1, 2}, {2, 1}}, val[] = {1, 2, 3, 3, 5}
Output:
1
3
Explanation:
Query 1: X = 1, D = 2
The nodes atmost at a distance 2 from the node 1 are {1, 3, 4, 5} and the weights assigned to these nodes are {1, 3, 3, 5} respectively.
Therefore, the minimum weight assigned is 1.
Query 2: X = 2, D = 1
The nodes atmost at a distance 1 from node 2 is {2, 3} and the weights assigned to these nodes are {2, 3} respectively.
Therefore, the minimum weight assigned is 2.
Input: Q[][] = {{1, 2}}, val[] = {1, 2, 4}
Output: 1
天真的方法:
解决每个查询的最简单方法是迭代树并找到与节点X最远距离 D的所有节点,并找到分配给这些节点的所有权重中的最小值。
时间复杂度: O(Q * N)
辅助空间: O(1)
有效的方法:
要优化上述方法,请按照以下步骤操作:
- 实现树的 Euler Tour 并为树的每个节点分配一个索引。
- 现在,在每个索引处,将与节点关联的深度和值存储在数组中。
- 在数组上构建 Merge Sort Tree 并根据节点的深度对范围进行排序。
- 对于每个查询,已知 X 的子树的所有节点都位于 in[X] 和 out[X] 数组之间,其中 in 和 out 是节点执行 DFS 的索引。
- 在此范围内,找到距离至多为D的最小加权节点。构建Merge Sort Tree ,按照深度的递增顺序将两个范围合并,在Merge Sort Tree的每个节点的值中找到前缀最小值。
下面是上述方法的实现:
C++
1
/ \
4 5
/
3
/
2
1
/ \
2 3
时间复杂度: O(N * log(N) + Q * log(N))
辅助空间: O(N * log N)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live