Algorithm 更新数组

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 ->如果当前节点的范围与更新重叠 范

给定一个初始化为0的数组arr,即arr[i]=0,其中0 对其执行两个操作

  • 更新krx

    更新将执行以下操作:

    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