标签:c++
题目链接:
题解思路:
模板题 需要用到懒惰标记
代码:
#include<iostream> #include<cstdio> #include<cstring> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 100050 using 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; }
标签:c++
原文地址:http://blog.csdn.net/axuan_k/article/details/46447009