poj 1195 Mobile phones(二维树状数组基础)
2014-02-13 10:05
417 查看
http://poj.org/problem?id=1195
题意:有一个s*s的方格,有两种操作,给某个方格a[x][y] 加上一个数add 和 询问某一个子矩阵内所有数字的和。
思路:二维树状数组的模板。。要注意的是题目中的下标从0开始而树状数组的下标从1开始,所以下标均向右移一位。
题意:有一个s*s的方格,有两种操作,给某个方格a[x][y] 加上一个数add 和 询问某一个子矩阵内所有数字的和。
思路:二维树状数组的模板。。要注意的是题目中的下标从0开始而树状数组的下标从1开始,所以下标均向右移一位。
#include <stdio.h> #include <string.h> const int maxn = 1030; int Lowbit(int x) { return x&(-x); } int c[maxn][maxn]; int n; //给a[i][j]节点加上add; void update(int i, int j, int add) { while(i <= n) { int tmp = j; while(tmp <= n) { c[i][tmp] += add; tmp += Lowbit(tmp); } i += Lowbit(i); } } //a[1][1]~a[i][j]的和(原数组) int sum(int i, int j) { int s = 0; while(i > 0) { int tmp = j; while(tmp > 0) { s += c[i][tmp]; tmp -= Lowbit(tmp); } i -= Lowbit(i); } return s; } int main() { int f; int x,y,add; int l,r,b,t; memset(c,0,sizeof(c)); while(1) { scanf("%d",&f); if(f == 0) scanf("%d",&n); else if(f == 1) { scanf("%d %d %d",&x,&y,&add); update(x+1,y+1,add); } else if(f == 2) { scanf("%d %d %d %d",&l,&b,&r,&t); l++;//均向后移一位,相对位置不变 r++; b++; t++; int ans = sum(r,t)-sum(l-1,t)-sum(r,b-1)+sum(l-1,b-1); printf("%d\n",ans); } else if(f == 3) break; } return 0; }
相关文章推荐
- POJ-1195 Mobile phones(二维树状数组裸题)
- POJ-1195-Mobile phones-裸二维树状数组(单点更新,矩阵求和)
- (简单) POJ 1195 Mobile phones,二维树状数组。
- POJ1195 Mobile phones(简单二维树状数组)
- POJ 1195 Mobile phones【二维树状数组】
- POJ1195 Mobile phones【树状数组】【二维】
- poj_1195Mobile phones,二维树状数组
- poj1195 Mobile phones(二维树状数组单点更新)
- poj_1195Mobile phones,二维树状数组
- POJ 1195 Mobile phones【 二维树状数组 】
- POJ 1195 Mobile phones(二维树状数组,点修改,区间查询)
- POJ 1195-Mobile phones(二维树状数组-区间更新区间查询)
- POJ 1195 Mobile phones(二维树状数组,点修改,区间查询)
- poj 1195 Mobile phones(二维的树状数组)得好好看。。。
- POJ 1195 (Mobile phones) 二维树状数组
- POJ 1195-Mobile phones-二维树状数组
- 文章标题 POJ 1195 :Mobile phones(二维树状数组 模板)
- poj 1195:Mobile phones(二维树状数组,矩阵求和)
- POJ 1195 Mobile phones【二维树状数组】
- POJ 1195 二维树状数组