是否可以执行范围添加更新,向最大段树添加线性函数?

时间:2015-04-01 06:28:52

标签: c++ algorithm time-complexity segment-tree

我正在考虑这个问题,并且在尝试这样做时遇到了很多错误。有可能吗?

1 个答案:

答案 0 :(得分:0)

我相信您在询问是否可以进行以下更新: 给定更新A B C,您希望将C添加到从A到B的所有元素。

问题是如果N是最大元素数,则对段树进行更新通常需要O(N * logN)时间。但是,关于实现段树的关键思想是,您希望假设范围查询,并且通常您对所有O(N ^ 2)范围不感兴趣,而是更小的子集。

您可以使用延迟传播增强范围更新,这通常意味着您进行了更新,但您没有更新细分树中的所有节点 - >你更新到某个点,但你不会继续下去,因为它不需要 假设您已将所有内容更新到节点K,该节点K负责范围[10;例如,30]。稍后,您在[20; 40]上执行“获取信息”查询。显然,您将不得不访问节点K,但您对整个范围不感兴趣,而是范围[20; 30],实际上是它的正确子项。
您需要做的是将节点K的更新“推”到其左子节点然后再将其子节点“更新”并根据需要继续。

一般情况下,这意味着在进行更新时,您只会进行更新,直到找到适合您更新间隔的节点,但不会再进行更新。这产生O(logN)时间 然后,在查询时,当您到达一个节点时,继续在树中传播更新,您知道这些节点已保存了一些更新以供日后使用。这也产生O(logN)时间。

一些好材料:Lazy propagation on segment trees