poj3468:A Simple Problem with Integers(线段树lazy)
2017-10-29 11:44
471 查看
poj3468 :A Simple Problem with Integers
普通的线段树区间更新,打上lazy标签即可,一个节点记录三个值,一个是区间的值,一个是lazy标签,记录了还未往下传递的值,另外一个是这个区间的长度(长度乘以传下来的lazy即是这个区间增加的值,建树的时候可以算出)。注意开好long long即可。
普通的线段树区间更新,打上lazy标签即可,一个节点记录三个值,一个是区间的值,一个是lazy标签,记录了还未往下传递的值,另外一个是这个区间的长度(长度乘以传下来的lazy即是这个区间增加的值,建树的时候可以算出)。注意开好long long即可。
#include #include #include #include #include #define MAXN 400000 using namespace std; struct node { long long value; long long lazy; int len; }; node tree[MAXN << 1]{}; long long value[MAXN]; int left_, right_; int length; long long buildtree(int index, int left, int right) { tree[index].len = right - left + 1; if (left == right) { tree[index].value = value[left]; } else { int mid = (left + right) >> 1; tree[index].value = buildtree(index << 1, left, mid) + buildtree(index << 1 | 1, mid + 1, right); } return tree[index].value; } long long getvalue(int index, int templeft, int tempright) { int lson = index << 1; int rson = index << 1 | 1; int mid = (templeft + tempright) >> 1; if (templeft >= left_ && tempright <= right_) return tree[index].value; if (templeft > right_ || tempright < left_) return 0; if (tree[index].lazy) { long long &lazy = tree[index].lazy; tree[lson].lazy += lazy; tree[lson].value += lazy * tree[lson].len; tree[rson].lazy += lazy; tree[rson].value += lazy * tree[rson].len; lazy = 0; } return getvalue(lson, templeft, mid) + getvalue(rson, mid + 1, tempright); } void modify(int index, long long value, int templeft, int tempright) { if (templeft >= left_ && tempright <= right_) { tree[index].lazy += value; tree[index].value += value*tree[index].len; return; } if (templeft > right_ || tempright < left_) return; int mid = (templeft + tempright) >> 1; int lson = index << 1; int rson = index << 1 | 1; if (tree[index].lazy) { long long &lazy = tree[index].lazy; tree[lson].lazy += lazy; tree[lson].value += lazy * tree[lson].len; tree[rson].lazy += lazy; tree[rson].value += lazy * tree[rson].len; lazy = 0; } modify(lson, value, templeft, mid); modify(rson, value, mid + 1, tempright); tree[index].value = tree[lson].value + tree[rson].value; } int main() { int size, opr; scanf("%d%d", &size, &opr); for (int i = 1; i <= size; i++) scanf("%lld", &value[i]); buildtree(1, 1, size); char ch; int a, b; long long c; getchar(); while (opr--) { ch = getchar(); if (ch == 'Q') { scanf("%d%d", &a, &b); left_ = a; right_ = b; printf("%lld\n", getvalue(1, 1, size)); } else { scanf("%d%d%lld", &a, &b, &c); left_ = a; right_ = b; modify(1, c, 1, size); } getchar(); } }
相关文章推荐
- POJ3468 A Simple Problem with Integers【线段树 成段更新+求和 lazy标志】
- poj3468 A Simple Problem with Integers 线段树lazy标签
- poj3468 A Simple Problem with Integers 线段树 区间更新 lazy
- POJ3468 A Simple Problem with Integers(线段树 lazy思想 区间查询更新)
- POJ3468 A Simple Problem with Integers(线段树区间更新,lazy标记)
- poj3468 A Simple Problem with Integers(线段树成段更新)
- POJ-3468-A Simple Problem with Integers(线段树区间维护 重写Lazy)
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
- 【成端更新线段树模板】POJ3468-A Simple Problem with Integers
- POJ3468 A Simple Problem with Integers(线段树)
- poj3468 A Simple Problem with Integers(spaly&&线段树)
- POJ3468 A Simple Problem with Integers(线段树)
- POJ3468 A Simple Problem with Integers 【线段树】+【成段更新】
- poj3468 A Simple Problem with Integers 线段树延迟标记区间更新区间求和
- poj3468 A Simple Problem with Integers 线段树入门题复习
- 【poj3468-A Simple Problem with Integers】-线段树区间更新
- POJ - 3468 - A Simple Problem with Integers - 线段树Lazy大法
- POJ3468 A Simple Problem with Integers(线段树延时标记)
- poj3468 A Simple Problem with Integers(线段树区间修改)
- POJ3468[A Simple Problem with Integers] 线段树基本操作