二维树状数组--子矩阵求和
2012-09-12 16:22
267 查看
#include <stdio.h> #define MAXN 1025 int c[MAXN][MAXN] = {0}; int a[MAXN][MAXN] = {0}; int lowbit(int n) { return n & (n ^ (n - 1)); } void add(int x, int y, int num, int n) { for (int i = x; i <= n; i += lowbit(i)) { for (int j = y; j <= n; j += lowbit(j)) { c[i][j] += num; } } } int GetSum(int x, int y) { int total = 0; for (int i = x; i > 0; i -= lowbit(i)) { for (int j = y; j > 0; j -= lowbit(j)) { total += c[i][j]; } } return total; } int query(int x1, int y1, int x2, int y2) { return GetSum(x2, y2) - GetSum(x1 - 1, y2) - GetSum(x2, y1 - 1) + GetSum(x1 - 1, y1 -1); } int main() { int instruct = 0; int n = 0; scanf("%d %d", &instruct, &n); while (true) { scanf("%d", &instruct); int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; int num = 0; if (1 == instruct)//指令为 将a[x1][y1] + num { scanf("%d %d %d", &x1, &y1, &num); add(x1 + 1, y1 + 1, num, n); } else if (2 == instruct)//指令为 求位于x1,y1到x2,y2的子矩阵的和 { scanf("%d %d %d %d", &x1, &y1, &x2, &y2); printf("%d\n", query(x1 + 1, y1 + 1, x2 + 1, y2 + 1)); } else if(3 == instruct)//结束指令 { break; } } return 0; }
相关文章推荐
- 一维二维树状数组区间加与区间求和
- 树状数组( 单点修改/区间修改+区间求和+一维/二维)
- HDU 1559 最大子矩阵 [二维树状数组]【数据结构】
- poj1195Mobile phones【二维树状数组。单点更新/区间求和】
- poj 1195:Mobile phones(二维树状数组,矩阵求和)
- poj1195(二维树状数组,点修改,区间求和)
- POJ-1195-Mobile phones-裸二维树状数组(单点更新,矩阵求和)
- BZOJ 2738 子矩阵第k大 | 二维树状数组 整体二分 分治
- 【二维树状数组】hdu 1559 最大子矩阵
- 二维树状数组 区间求和模板(#1336 : Matrix Sum)
- 树状数组一、二维区间修改与求和
- HDU 2642 二维树状数组(单点更新,区间求和)
- 2017.8.20------二维树状数组的求和问题
- BUAA 首A-简单树状数组(静态区间求和)
- hrbust 2046 哈理工oj 2046 最后的题目八个字【二维树状数组】
- 返回一个二维循环数组中最大子矩阵的和
- 二维树状数组 hdu 1892
- hdu 2642 Stars 二维树状数组水题
- poj 2155- Matrix (树状数组,二维,更新区间,查询单点)
- HDU 2642 二维树状数组问题