如何最佳地解决这个问题?

时间:2016-12-25 17:10:19

标签: algorithm time-complexity graph-algorithm

我有一个n个顶点n<=10^5的树,其中每个顶点都有一个得分[i]和q个查询q<=10^5 每个查询都有两个参数u和L,我需要找到

sum(score[i]) for all i where lca(i,u)=u and dist(u,i)=L

我可以使用bfs在O(n)时间内解决每个查询,但效率不高。我该如何优化呢?我花了很多时间在这上面,但在nlogn时间内无法找到解决问题的方法。

感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:0)

u处于深度h。那么我们需要找到的是h + L子树中深度为u的所有顶点的总和(它只是问题的重新制定)。

  1. 让我们存储一个顶点向量,按照每个级别的入口时间排序。

  2. 子树是深度为h + L的向量中的连续段。

  3. 我们可以使用二进制搜索找到它的边框(类似于C ++中的lower_bound(at_depth[h + L].begin(), at_depth[h + L].end(), entrance_time[u])upper_bound(at_depth[h + L].begin(), at_depth[h + L].end(), leave_time[u]))。

  4. 答案是此范围内的得分总和。我们可以使用前缀sums在O(1)中找到它。

  5. 此解决方案需要二进制搜索和每个查询两个前缀和查找,因此它在O(log N)时间内工作。

相关问题