📌  相关文章
📜  查询以从节点 X 的至多 D 距离节点的子树中查找最小权重

📅  最后修改于: 2021-09-16 10:56:33             🧑  作者: Mango

给定一个以1 为根的 N 元树,一个数组val[]由分配给每个节点的权重组成,以及一个矩阵Q[][] ,由形式为{X, D}的查询组成,每个查询的任务是找到分配给与节点 X 最大距离为 D的节点的所有权重中的最小值。

例子:

天真的方法:
解决每个查询的最简单方法是迭代树并找到与节点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)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。