一维树状数组区间更新区间查询
2017-10-10 22:02
309 查看
推理过程
维护两个数组,d[i] = a[i] - a[i - 1],f[i] = i * d[i],剩下的,区间更新和区间查询就和【一维树状数组区间更新单点查询】一样了。
实现源代码
维护两个数组,d[i] = a[i] - a[i - 1],f[i] = i * d[i],剩下的,区间更新和区间查询就和【一维树状数组区间更新单点查询】一样了。
实现源代码
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n = 20; int a[40], d[40], f[40]; int query(int* arr, int x) { int res = 0; for(int i = x; i > 0; i -= (i & -i))res += arr[i]; return res; } void update(int* arr, int x, int val) { for(int i = x; i <= n; i += (i & -i))arr[i] += val; } inline int getsum(int x){ return (x + 1) * query(d, x) - query(f, x); } int main() { memset(a, 0, sizeof(a)); memset(d, 0, sizeof(d)); memset(f, 0, sizeof(f)); for(int i = 1; i <= n; ++i) { a[i] = i; int t = a[i] - a[i - 1]; update(d, i, t); update(f, i, t * i); } for(int i = 1; i <= n; ++i) { printf("sum(%d) = %d\n", i, getsum(i)); } puts("------------------------------------------"); int x = 1, y = 10, val = 20; update(d, x, val); update(d, y + 1, -val); update(f, x, val * x); update(f, y + 1, -val * (y + 1)); printf("sum(10) = %d\n", getsum(10)); return 0; }
相关文章推荐
- poj3468-树状数组 一维 区间更新 区间查询
- HDU 1556 Color the ball (一维树状数组,区间更新,单点查询)
- hdu1556-树状数组 一维 区间更新 单点查询
- 树状数组(二叉索引树 BIT Fenwick树) *【一维基础模板】(查询区间和+修改更新)
- 树状数组区间更新区间查询
- POJ 3468 A Simple Problem with Integers (树状数组解法 树状数组区间更新 区间查询)
- SGU 180 Inversions <一维树状数组区间查询>
- hdu2642-二维树状数组 单点更新 区间查询
- hdu 2642二维树状数组 单点更新区间查询 模板题
- hdu 3584 Cube (三维树状数组,更新区间,查询单点)
- 2017.8.23-------树状数组---区间更新+区间查询
- 树状数组:HDU1166敌兵布阵 【单点更新,区间查询】
- (树状数组)hdu1556 Color the ball(区间更新,单点查询)
- 树状数组的单点更新,区间查询。
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
- hdu 2642二维树状数组 单点更新区间查询 模板题
- POJ 2155 - Matrix 二维树状数组..区间更新..单点查询
- Flowers(树状数组+区间更新+单点查询+区间更新单点查询模板)
- 树状数组(区间更新区间查询)
- 树状数组进阶应用:区间更新、区间最值查询