poj-3468 区间操作
来源:互联网 发布:现在什么网游支持mac 编辑:程序博客网 时间:2024/05/14 09:32
http://poj.org/problem?id=3468
区间求和操作 ,一个区间加操作。
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <cstdlib>#include <algorithm>#include <vector>#include <set>#include <map>#include <iomanip>using namespace std;#define ll(ind) (ind<<1)#define rr(ind) (ind<<1|1)#define Mid(a,b) (a+((b-a)>>1))typedef __int64 LL;const int N = 100100;int a[N];struct node{int left, right;LL sum, lazy;;int mid(){return Mid(left, right);}void fun(LL summ){lazy += summ;sum += (right - left + 1) * summ;}};struct segtree{node tree[N * 4];void real(int ind)//更新懒惰标记{if (tree[ind].lazy){tree[ll(ind)].fun(tree[ind].lazy);tree[rr(ind)].fun(tree[ind].lazy);tree[ind].lazy = 0;}}void buildtree(int left, int right, int ind)//建树{tree[ind].left = left;tree[ind].right = right;tree[ind].sum = 0;tree[ind].lazy = 0;if (left == right){tree[ind].sum = a[left];}if (left != right){int mid = tree[ind].mid();buildtree(left, mid, ll(ind));buildtree(mid + 1, right, rr(ind));tree[ind].sum = tree[ll(ind)].sum + tree[rr(ind)].sum;}}void update(int st, int ed, int ind, int type)//更新{int left = tree[ind].left;int right = tree[ind].right;if (st <= left && right <= ed)tree[ind].fun(type);else{real(ind);int mid = tree[ind].mid();if (st <= mid) update(st, ed, ll(ind), type);if (ed > mid) update(st, ed, rr(ind), type);tree[ind].sum = tree[ll(ind)].sum + tree[rr(ind)].sum;}}LL query(int st, int ed, int ind)//求和{int left = tree[ind].left;int right = tree[ind].right;if (st <= left && right <= ed)return tree[ind].sum;else{real(ind);int mid = tree[ind].mid();LL s1 = 0, s2 = 0;if (st <= mid)s1 = query(st, ed, ll(ind));if (ed > mid)s2 = query(st, ed, rr(ind));return s1 + s2;}}}seg;int main(){int n, m;int x, y, z;while (scanf("%d %d", &n, &m) != EOF){for (int i = 1; i <= n; i++)scanf("%d", &a[i]);seg.buildtree(1, n, 1);char d[5];while (m--){scanf("%s", d);if (d[0] == 'Q'){scanf("%d %d", &x, &y);cout << seg.query(x, y, 1) << endl;}else{scanf("%d %d %d", &x, &y, &z);seg.update(x, y, 1, z);}}}return 0;}
0 0
- poj-3468 区间操作
- poj 3468 Splay Tree 区间操作
- treap分离合并 区间操作 poj 3468
- poj 3468 区间更新 整个区间加一个数和区间求和操作
- POJ 3468 线段树 区间操作 懒惰标记
- POJ 3468(区间更新)
- poj 3225 区间(区间的交并补操作)
- 【POJ 3667】 hotel 【线段树 +区间操作+区间合并】
- POJ 3225 区间操作 交并补
- POJ 3580 SuperMemo (Splay各种区间操作)
- POJ 3468 【动态区间改变区间值】
- POJ 3468(区间更新,求和)
- POJ 3468 线段树区间
- POJ 3468 A Simple Problem with Integers (伸展树区间更新求和操作 , 模板)
- POJ 3468 A Simple Problem with Integers(线段树区间操作)
- poj 1436 线段树区间操作 Horizontally Visible Segments
- POJ 3667 Hotel 带区间合并操作的线段树
- POJ 3225 Help with Intervals --线段树区间操作
- Wildcard Matching -- leetcode
- 加了多线程的demo
- iOS_两种方法删除NSUserDefaults所有记录
- unity手游<少侠历险记>(1)使用CharacterController控制人物移动
- UVaOJ-11827-Maximum GCD 解题报告
- poj-3468 区间操作
- 轻松搞定TB级数据,开源GraphLab突破人类图计算“极限值”
- iOS 提高
- call和apply方法
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)
- print unsigned char in C && struct iovec
- 动态调用webservice20150121
- JS中的prototype
- 解决问题的法宝——追根溯源