我有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
的所有查询中解决它的方法。
任何帮助将不胜感激。谢谢
让u
处于深度h
。那么,我们需要找到的是u
的子树中深度h + L
的所有顶点的得分之和(这只是问题的重新汇总)。
-
让我们存储一个以每个级别的入口时间排序的顶点的向量。
-
子树是深度
h + L
的向量中的连续段。 -
我们可以使用二进制搜索找到其边界(例如
lower_bound(at_depth[h + L].begin(), at_depth[h + L].end(), entrance_time[u])
,C 中的upper_bound(at_depth[h + L].begin(), at_depth[h + L].end(), leave_time[u])
)。 -
答案是该范围内的得分之和。我们可以在
O(1)
中使用前缀总和。
此解决方案需要进行二进制搜索,并且每个查询的两个前缀总和查找UPS,因此它在O(log N)
时间中起作用。