hiho1078 线段树的区间修改

题目链接:

hihocoder1078

题解思路:

模板题 需要用到懒惰标记

代码:

#include<iostream>#include<cstdio>#include<cstring>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define maxn 100050using namespace std;int sum[maxn<<2];int tag[maxn<<2]={0};void pushup(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void pushdown(int rt,int d){if(tag[rt]){tag[rt<<1]=tag[rt<<1|1]=tag[rt];sum[rt<<1]=(d-(d>>1))*tag[rt];sum[rt<<1|1]=(d>>1)*tag[rt];tag[rt]=0;}}void build(int l,int r,int rt){if(l==r){scanf("%d",&sum[rt]);return;}int m=(l+r)>>1;build(lson);build(rson);pushup(rt);}void update(int L,int R,int v,int l,int r,int rt){if(L<=l&&R>=r){sum[rt]=(r-l+1)*v;tag[rt]=v;return;}pushdown(rt,r-l+1);int m=(l+r)>>1;if(m>=L)update(L,R,v,lson);if(m<R)update(L,R,v,rson);pushup(rt);}int query(int L,int R,int l,int r,int rt){if(L<=l&&R>=r)return sum[rt];pushdown(rt,r-l+1);int m=(l+r)>>1,s=0;if(m>=L)s=query(L,R,lson);if(m<R)s+=query(L,R,rson);return s;}int main(){int n,q,op,l,r,v;scanf("%d",&n);build(1,n,1);scanf("%d",&q);while(q–){scanf("%d%d%d",&op,&l,&r);if(op==0)printf("%d\n",query(l,r,1,n,1));else{scanf("%d",&v);update(l,r,v,1,n,1);}}return 0;}

,当爱丽思丢失了通往仙境的钥匙,

hiho1078 线段树的区间修改

相关文章:

你感兴趣的文章:

标签云: