线段树模板
2016-09-10 17:32
323 查看
2017.12.8 更新
全部推倒重来,不知道多少次出问题了,难受。
全部推倒重来,不知道多少次出问题了,难受。
class SegmentTree { private: int *data, *lazy; void pushup(int rt) { data[rt] = data[rt << 1] + data[rt << 1 | 1]; } void pushdown(int rt, int m) { if (lazy[rt] == 0) return; lazy[rt << 1] += lazy[rt]; lazy[rt << 1 | 1] += lazy[rt]; data[rt << 1] += (m - (m >> 1)) * lazy[rt]; data[rt << 1 | 1] += (m >> 1) * lazy[rt]; lazy[rt] = 0; } public: SegmentTree(int n) : data((int *)malloc((n << 3) * sizeof(int))), lazy((int *)malloc((n << 3) * sizeof(int))) {} void Build(int * base, int l, int r, int rt) { lazy[rt] = 0; if (l == r) data[rt] = base[l]; else { int mid = (l + r) >> 1; Build(base, l, mid, rt << 1); Build(base, mid + 1, r, rt << 1 | 1); pushup(rt); } } void Modify(int l, int r, int rt, int L, int R, int v) { if (L <= l && R >= r) { lazy[rt] += v; data[rt] += v * (r - l + 1); return; } pushdown(rt, r - l + 1); int mid = (l + r) >> 1; if (L <= mid) Modify(l, mid, rt << 1, L, R, v); if (R > mid) Modify(mid + 1, r, rt << 1 | 1, L, R, v); pushup(rt); } int QueryPoint(int l, int r, int rt, int val) { if (l == r) return data[rt]; pushdown(rt, r - l + 1); int mid = (l + r) >> 1; int ret = 0; if (val <= mid) ret = QueryPoint(l, mid, rt << 1, val); else ret = QueryPoint(mid + 1, r, rt << 1 | 1, val); pushup(rt); return ret; } int QuerySegment(int l, int r, int rt, int L, int R) { pushdown(rt, r - l + 1); if (L == l && R == r) return data[rt]; int mid = (l + r) >> 1; if (R <= mid) return QuerySegment(l, mid, rt << 1, L, R); if (mid < L) return QuerySegment(mid + 1, r, rt << 1 | 1, L, R); return QuerySegment(l, mid, rt << 1, L, mid) + QuerySegment(mid + 1, r, rt << 1 | 1, mid + 1, R); } };
相关文章推荐
- hdu 3074 Multiply game(模板级线段树)
- 线段树模板
- 线段树(大三的模板)
- ACM常用模板——数据结构——线段树
- [模板]-线段树-无Lazy
- HDU 1754 I Hate It(线段树-水题,模板题)
- 算法模板——线段树
- 刘汝佳 线段树模板
- poj2528&&线段树模板
- 线段树模板--C++
- 【Splay】洛谷3372 【模板】线段树 1
- HDU-1542-Atlantis-线段树+面积并(模板)
- 线段树模板——Orz SWC学长
- 【Codevs】1082 线段树练习 3 && 线段树模板
- Poj 3667 线段树区间合并 (模板)
- 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)
- 【NOIP模板】 线段树
- poj 3468 线段树区间更新,模板题
- 【模板】线段树 1
- poj3468 A Simple Problem with Integers(线段树模板 功能:区间增减,区间求和)