[学习笔记] 树状数组区间加+区间求和
来源:互联网 发布:修改软件下载 编辑:程序博客网 时间:2024/06/16 13:22
- 记
bi=ai−ai−1,ci=(i−1)×bi ,则:∑i=1nai =a1+a2+…+an =∑i=11bi+∑i=12bi+…+∑i=1nbi =n×∑i=1nbi−∑i=1n(i−1)×bi =n×∑i=1nbi−∑i=1nci - 我们用两个树状数组分别维护
bi,ci
1.令区间[l,r] 加上x ,即为bl+=x,br+1−=x cl+=(l−1)×x,cr+1−=r×x
2.询问区间[l,r] 的和,即为r×∑i=1rbi−∑i=1rci−(l−1)×∑i=1l−1bi+∑i=1l−1ci - 代码
const int N = 1e5 + 5;ll b[N], c[N]; int a[N], n, m;inline void Modify(ll *s, int x, ll y){ for (; x <= n; x += x & -x) s[x] += y;}inline ll Query(ll *s, int x){ ll res = 0; for (; x; x ^= x & -x) res += s[x]; return res;}int main(){ n = get(); m = get(); int k, l, r, x; for (int i = 1; i <= n; ++i) { a[i] = get(); Modify(b, i, a[i] - a[i - 1]); Modify(c, i, 1ll * (i - 1) * (a[i] - a[i - 1])); } while (m--) { k = get(); l = get(); r = get(); if (k & 1) { x = get(); Modify(b, l, x); Modify(b, r + 1, -x); Modify(c, l, 1ll * (l - 1) * x); Modify(c, r + 1, -1ll * r * x); } else { --l; put(Query(b, r) * r - Query(c, r) - Query(b, l) * l + Query(c, l)); putchar('\n'); } }}
阅读全文
1 0
- [学习笔记] 树状数组区间加+区间求和
- 一维二维树状数组区间加与区间求和
- 树状数组--区间求和
- 树状数组,区间求和
- 树状数组 区间更新 区间求和
- poj3468(树状数组:区间修改 区间求和)
- 树状数组 区间更新 区间求和
- 树状数组 区间修改区间求和总结
- 树状数组区间求和三种模型
- 树状数组区间求和三种模型
- 树状数组区间求和三种模型
- 树状数组区间求和三种模型
- 树状数组区间求和三种模型
- 树状数组区间求和三种模型
- 详解树状数组 区间修改求和
- 树状数组的区间修改求和
- 笔记 树状数组--区间查询+区间修改
- poj 3468 树状数组解法(解决区间更新,区间求和)
- LinkedList源码笔记
- 大数据(三十一)HBASE【Hbase Shell 常用命令】
- 内存漫谈
- 人脸检测——DDFD
- [Java读书笔记]之Swing
- [学习笔记] 树状数组区间加+区间求和
- 整数全排列问题
- 不同的路径
- 给定一个链表,一次颠倒链表k的节点并返回其修改列表。如果节点的数量不是k的倍数,那末最后的剩余节点应该保持原样。
- leetcode19Remove Nth Node From End of List
- Java 8 – 怎样对Map排序
- BP算法
- AD的多根走线
- C++笔记(第四章)