这个问题是线段树的模板问题
但是,与前面的问题不同,这个问题是区间修正,所以引入lazy tag。
如果直接修改行树中的所有儿子,时间会超限,我们可以直接将父亲的值传递给美丽的香气,用lazy tag标记,需要使用当前子树时继续传递lazy tag即可。
代码# include iostream # include cstdio # includecmathusingnamespacestd; 长龙w,l,r,xx,n,q; 结构节点{ long long sum,lazy; }tree[4000010]; voidbuild(longlongk,long long l,long long r ) if ) l==r ) Scanf ) ' %lld ',tree[k].sum ); 返回; )长龙mid=(lr ) 1; build(k*2、l、mid ); Build(k*21、mid 1、r ); tree [ k ].sum=tree [ k *2].sumtree [ k * 21 ].sum; }voidadd(longlongk,long long l,long long r,long long v ) {tree[k].lazy=v; tree[k].sum=v*(r-L1 ); }voidpushdown(longlongk,long long l,long long r,long long mid ) if (! tree [ k ].lazy (返回; add(k*2,l,mid,tree[k].lazy ); add(k*21,mid 1,r,tree[k].lazy ); tree[k].lazy=0; ) voidchange(longlongk,long long x,long long y,long long l,long long r ) ) longlongmid=(Lr ) 1; if(x=lr=y ) add ) k、l、r、xx ); 返回; }推式下降(k、l、r、mid ); if(x=mid )变更(k * 2,x,y,l,mid ); if(ymid )变更(k * 21,x,y,mid 1,r ); tree [ k ].sum=tree [ k *2].sumtree [ k * 21 ].sum; }长时间查询(长时间k,长时间x,长时间y,长时间l,长时间r ) ) if(x=lr=y )返回树[ k ].sum; 长长度mid=(lr ) 1,js=0; 推送下压(k、l、r、mid ); if(x=mid ) js=query ) k*2,x,y,l,mid ); if(ymid ) js=query(k*21,x,y,mid 1,r ); 返回Js; (}int main ) ) {cinnq; build (1,1,n ); for (长龙I=1; i=q; I )扫描(' % lld % lld % lld )、w、l、r ); if(w==1) scanf ) ' %lld ',xx ); 变更(1,l,r,1,n ); (if ) w==2) printf('%lld(n ),query(1) ) 1,l,r,1,n ); }返回0; }