您的位置:首页 > 其它

线段树模板

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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: