假设我有一个数组,我必须回答查询,比如找到从索引i到j的所有元素的总和,现在我可以在root树上执行此操作,就像回答从节点i到j的路径的此类查询一样(在从i到j)的唯一路径上。
我知道如何使用范围最小查询查找LCA,我们将其分解为线性数组,然后使用分段树,但我无法对求和进行修改。我该怎么做?
答案 0 :(得分:0)
这取决于您的处理要求:您是否有复杂性限制,或者目标是在午餐时间之前使用可维护的代码?
如果是后者,请采取简单的方法:
第一学期的数据结构学生很容易理解这个算法。通过对LCA的一致性检查,它的 O (log(n)^ 2) - 不错,但不是LCA的线性预工作和恒定时间查询返回的最佳值。
如果您需要更快的算法,那么我建议您扩充LCA预处理算法,以便每个节点还计算其每个祖先的部分和的散列列表(例如Python字典)。完成后,您可以对LCA进行恒定时间计算,并对每个部分和进行恒定时间查找。