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

C++ 是否可以执行范围添加更新,将线性函数添加到最大段树?,c++,algorithm,time-complexity,segment-tree,C++,Algorithm,Time Complexity,Segment Tree,我正在考虑这个问题,在尝试这样做的时候遇到了很多错误。有可能吗?我相信您正在询问是否可以执行以下更新: 给定更新abc,您希望将C添加到从A到B的所有元素中 问题是在段树上进行更新通常需要O(N*logN)时间,因为N是元素的最大数量。然而,实现段树的关键思想是,您希望假设范围查询,并且通常您对所有O(N^2)范围都不感兴趣,而是对其中的一个小得多的子集感兴趣 您可以使用延迟传播增强范围更新,这通常意味着您要进行更新,但您不会更新段树中的所有节点->您会更新到某个点,但由于不需要更新,您不会继续

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

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

问题是在段树上进行更新通常需要O(N*logN)时间,因为N是元素的最大数量。然而,实现段树的关键思想是,您希望假设范围查询,并且通常您对所有O(N^2)范围都不感兴趣,而是对其中的一个小得多的子集感兴趣

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

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


一些好的材料:

请准确解释我们的操作是什么样子的。听起来很难。你的方法是什么?