我有一个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
时间内无法找到解决问题的方法。
感谢任何帮助。感谢
答案 0 :(得分:0)
让u
处于深度h
。那么我们需要找到的是h + L
子树中深度为u
的所有顶点的总和(它只是问题的重新制定)。
让我们存储一个顶点向量,按照每个级别的入口时间排序。
子树是深度为h + L
的向量中的连续段。
我们可以使用二进制搜索找到它的边框(类似于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])
)。
答案是此范围内的得分总和。我们可以使用前缀sums在O(1)
中找到它。
此解决方案需要二进制搜索和每个查询两个前缀和查找,因此它在O(log N)
时间内工作。