Algorithm 更新数组
给定一个初始化为0的数组arr,即arr[i]=0,其中0 对其执行两个操作Algorithm 更新数组,algorithm,segment-tree,Algorithm,Segment Tree,给定一个初始化为0的数组arr,即arr[i]=0,其中0如果当前节点的范围完全位于 更新查询范围 i) Update the Current node, by assigning it (lazy_value)*(length of interval it represents) ii) Postpone updates to children by setting lazy values for children nodes as new_value ->如果当前节点的范围与更新重叠 范
for(i=k;i<=r;i++)
{
arr[i]=x;
x+=x;
}
for(i=k;i您要查找的是段树中的延迟传播。
我们创建了一个与段树数组大小相同的数组lazy[],其思想是我们可以通过延迟递归调用来避免更新中的递归调用,并且只在需要时进行更新
下面的代码对预定义的数据进行更新和求和提取,您可以用main来接受所需模式中的用户数据,并添加x+=x等调整
我建议您打开代码,并排阅读下面的解释,以便更好地理解,因为惰性传播通常很难理解
工作原理:
- 最初,lazy[]数组中的所有条目都设置为0,这意味着在该节点所代表的范围内没有剩余的工作要做
- 要将数组索引处的段树从qs(查询开始)更新为qe(查询结束),请执行以下操作:
->如果当前段树节点有任何挂起
更新,然后我们指定该节点(lazy_值)*(它表示的间隔长度),并将其子节点的lazy值指定为新的_值
->如果当前节点的范围完全位于
更新查询范围
i) Update the Current node, by assigning it (lazy_value)*(length of interval it represents)
ii) Postpone updates to children by setting lazy values for children nodes as new_value
->如果当前节点的范围与更新重叠
范围,遵循与上述相同的方法
更新
a、 左右两侧儿童复发
b、 使用左键的结果更新当前节点
正确的选择
- 现在,当我们使用get_sum过程时,如果当前节点有任何挂起的更新,我们也会更新它,并将更新推迟到子节点
总的来说,这里很难解释延迟传播的整个工作原理,尽管我希望代码和解释能有所帮助
有关延迟传播的更多信息,请参见
您可以添加问题的约束条件吗?如x、k和r可以取值的范围。使用Fenwick树保留前缀和。发布此类问题时,您需要显示约束条件,如总数组大小和查询数。解决方案通常与约束条件紧密相关。数组的约束条件大小为
i) Update the Current node, by assigning it (lazy_value)*(length of interval it represents)
ii) Postpone updates to children by setting lazy values for children nodes as new_value