线段树模板
2017-06-25 21:00
183 查看
昨天又刷了一遍线段树的基础题,复习了一下模板,贴出来以便以后复习。
#include <iostream> #include <cstdio> #include <cstring> #define mid ((l + r) >> 1) #define lson id << 1 #define rson id << 1 | 1 using namespace std; long long sum[1000010], lazy[1000010]; inline void PushUp(int id) { sum[id] = sum[lson] + sum[rson]; } void Build(int l, int r, int id) { if(l == r) { scanf("%lld", &sum[id]); return ; } Build(l, mid, lson); Build(mid + 1, r, rson); PushUp(id); } void PushDown(int id, int num) { lazy[lson] += lazy[id]; lazy[rson] += lazy[id]; sum[lson] += (num - num / 2) * lazy[id]; sum[rson] += (num / 2) * lazy[id]; lazy[id] = 0; } void Update(int l, int r, int id, int cl, int cr, long long v) { if(l > cr || r < cl) return ; if(lazy[id]) PushDown(id, r - l + 1); if(l >= cl && r <= cr) { sum[id] += (r - l + 1) * v; lazy[id] += v; return ; } Update(l, mid, lson, cl, cr, v); Update(mid + 1, r, rson, cl, cr, v); PushUp(id); } long long QuerySum(int l, int r, int id, int ql, int qr) { if(l > qr || r < ql) return 0; if(lazy[id]) PushDown(id, r - l + 1); if(l >= ql && r <= qr) return sum[id]; return QuerySum(l, mid, lson, ql, qr) + QuerySum(mid + 1, r, rson, ql, qr); } int main() { int n, optimes; long long add; char c; while(~scanf("%d %d", &n, &optimes)) { memset(sum, 0, sizeof(sum)); memset(lazy, 0, sizeof(lazy)); Build(1, n, 1); getchar(); int l, r; while(optimes --) { scanf("%c", &c); if(c == 'Q') { scanf("%d %d", &l, &r); printf("%lld\n", QuerySum(1, n, 1, l, r)); } if(c == 'C') { scanf("%d %d %lld", &l, &r, &add); Update(1, n, 1, l, r, add); } getchar(); } } return 0; }
相关文章推荐
- 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
- POJ 3468(线段树模板 Lazy)
- hdu1166 敌兵布阵(线段树点更新模板题)
- 【常用模板】 线段树区间操作
- P3834 【模板】可持久化线段树 1(主席树)
- 可持久化数组(线段树)[模板题]
- hdu 1754 I Hate It【线段树入门+模板详解】
- 【HDU 4819】Mosaic 二维线段树模板
- Duan2baka的线段树模板!
- 线段树求区间和模板
- 线段树模板合集--单点替换,区间替换,区间增加3种情况
- 基本线段树模板(建树、点/区间修改、查询)
- 线段树背诵用模板
- 线段树常用模板(转)
- 线段树模板
- HDU 1166 敌兵布阵 (线段树点更新/模板)
- 线段树模板
- 线段树模板(区间最值)
- 线段树 --- (单点更新、区间最值、模板题)
- 【洛谷P3372】【模板】线段树1