线段树区间修改 lazy标记 大法
2015-05-03 10:39
423 查看
#include <cstdio> #include <cstring> #define maxn 100000 + 10 #define Lson L, mid, rt<<1 #define Rson mid+1, R, rt<<1|1 struct Node { int sum, lazy; } T[maxn<<2]; void PushUp(int rt) { T[rt].sum = T[rt<<1].sum + T[rt<<1|1].sum; } void PushDown(int L, int R, int rt) { int mid = (L + R) >> 1; T[rt<<1].sum = T[rt].lazy * (mid - L + 1); T[rt<<1|1].sum = T[rt].lazy * (R - mid); T[rt<<1].lazy = T[rt].lazy; T[rt<<1|1].lazy = T[rt].lazy; T[rt].lazy = 0; } void Build(int L, int R, int rt) { if(L == R) { scanf("%d", &T[rt].sum); return ; } int mid = (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) { T[rt].lazy = v; T[rt].sum = v * (R - L + 1); return ; } int mid = (L + R) >> 1; if(T[rt].lazy) PushDown(L, R, rt); if(r <= mid) Update(l, r, v, Lson); else if(l > mid) Update(l, r, v, Rson); else { Update(l, mid, v, Lson); Update(mid+1, r, v, Rson); } PushUp(rt); } int Query(int l, int r, int L, int R, int rt) { if(l==L && r== R) return T[rt].sum; int mid = (L + R) >> 1; if(T[rt].lazy) PushDown(L, R, rt); if(r <= mid) return Query(l, r, Lson); else if(l > mid) return Query(l, r, Rson); return Query(l, mid, Lson) + Query(mid + 1, r, Rson); } int main() { int n, q; scanf("%d", &n); Build(1, n, 1); scanf("%d", &q); int a, b, c, d; while(q--) { scanf("%d%d%d", &a, &b, &c); if(a) { scanf("%d", &d); Update(b, c, d, 1, n, 1); } else printf("%d\n", Query(b, c, 1, n, 1)); } return 0; }
相关文章推荐
- 线段树区间修改之双标记 【lazy两重标记并且分类讨论】
- [模板] - 线段树 - Lazy标记 - 单点/区间更新 - 模板
- hiho一下 第二十周(线段树区间修改+延迟标记)
- 线段树 -- 区间修改 【下放懒人标记】
- 【题】【线段树(不用lazy的区间修改)】NKOJ 2997 狗 【nodgd造水题】
- HDU 1698-Just a Hook(线段树_区间更新+lazy标记)
- 线段树 (区间修改 区间查询 延迟标记)
- POJ 3468-A Simple Problem with Integers(线段树_区间更新+lazy标记)
- hdoj 1698 Just a Hook 【线段树 区间修改】【线段树 + lazy思想】
- 线段树区间更新模板(lazy延迟标记)(1698)
- 专题 线段树 E(区间更新,使用lazy标记)
- hdu 1698 线段树区间更新入门(lazy标记)
- 线段树求区间最大值+区间更新+区间求和+lazy标记
- POJ3468 A Simple Problem with Integers(线段树区间更新,lazy标记)
- bzoj 1798 双标记区间修改线段树
- kb-07线段树-03--区间修改查询--lazy思想
- 区间修改lazy线段树
- SKYLINE uva+线段树+区间的修改+lazy标记
- FZU 2171 防守阵地 II(线段树区间更新【lazy标记】)
- hihocoder1078线段树修改区间查询区间(懒标记)