Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 分段树,延迟传播_Data Structures_Lazy Evaluation_Propagation_Segment Tree - Fatal编程技术网

Data structures 分段树,延迟传播

Data structures 分段树,延迟传播,data-structures,lazy-evaluation,propagation,segment-tree,Data Structures,Lazy Evaluation,Propagation,Segment Tree,我对这个结构如何工作以及如何更新有一个很好的想法,但是当它与惰性传播一起工作时,我不知道该怎么做,因为许多问题都要求它通过比赛,我想知道如何使它工作 我正在spoj上尝试此问题: 如果有人能向我解释懒惰传播是如何适应这种情况的,我会接受这个想法并着手研究,我真的不想发布我的代码,因为我的想法是让这项工作由我自己完成,但需要一点帮助 我希望有人能为我的问题提供解决方案。这是我用延迟传播实现段树的片段。 希望这对你有帮助 #define int long long #define MAX 10000

我对这个结构如何工作以及如何更新有一个很好的想法,但是当它与惰性传播一起工作时,我不知道该怎么做,因为许多问题都要求它通过比赛,我想知道如何使它工作

我正在spoj上尝试此问题:

如果有人能向我解释懒惰传播是如何适应这种情况的,我会接受这个想法并着手研究,我真的不想发布我的代码,因为我的想法是让这项工作由我自己完成,但需要一点帮助


我希望有人能为我的问题提供解决方案。

这是我用延迟传播实现段树的片段。 希望这对你有帮助

#define int long long
#define MAX 100005*3

int  stree[MAX],lazy[MAX];

void update(int  cur,int  cur_lft,int  cur_rgt,int  st,int  en,int  val)
{
    if(cur_lft>en || cur_rgt<st) return ;
    if(cur_lft>=st && cur_rgt<=en)
    {
        stree[cur]+=val*(cur_rgt-cur_lft+1);
        lazy[cur]+=val;
        return;
    }
    int  l=cur<<1,r=(cur<<1)+1,mid=(cur_lft+cur_rgt)>>1;
    update(l,cur_lft,mid,st,en,val);
    update(r,mid+1,cur_rgt,st,en,val);
    stree[cur]=stree[l]+stree[r]+lazy[cur]*(cur_rgt-cur_lft+1);
}

int  query(int  cur,int  cur_lft,int  cur_rgt,int  st,int  en,int  lzy)
{
    if(cur_lft>en || cur_rgt<st) return 0;
    if(cur_lft>=st && cur_rgt<=en) return stree[cur]+lzy*(cur_rgt-cur_lft+1);
    int  l=cur<<1,r=(cur<<1)+1,mid=(cur_lft+cur_rgt)>>1;
    int  left_tree=query(l,cur_lft,mid,st,en,lzy+lazy[cur]);
    int  right_tree=query(r,mid+1,cur_rgt,st,en,lzy+lazy[cur]);
    return left_tree+right_tree;
}
query(1,0,n-1,lower_range,upper_range,0));
update(1,0,n-1,lower_range,upper_range,v);