【poj1195】Mobile phones(二维树状数组)
题目链接:http://poj.org/problem?id=1195
【题意】
给出一个全0的矩阵,然后一些操作
0 S:初始化矩阵,维数是S*S,值全为0,这个操作只有最开始出现一次
1 X Y A:对于矩阵的X,Y坐标增加A
2 L B R T:询问(L,B)到(R,T)区间内值的总和
3:结束对这个矩阵的操作
【思路】
二维树状数组单点更新+区域查询,可作为模板题。
注意坐标是从0开始,所以要+1
【代码】
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstdlib> 6 #include<cmath> 7 using namespace std; 8 const int N = 1029; 9 typedef long long LL; 10 int c[N][N], n; 11 int lowbit(int x) 12 { 13 return x & (-x); 14 } 15 void update(int x, int y, int num) 16 { 17 for(int i = x; i <= n; i += lowbit(i)) 18 for(int j = y; j <= n; j += lowbit(j)) 19 c[i][j] += num; 20 } 21 int query(int x, int y) 22 { 23 int sum = 0; 24 for(int i = x; i > 0; i -= lowbit(i)) 25 for(int j = y; j > 0; j -= lowbit(j)) 26 sum += c[i][j]; 27 return sum; 28 } 29 int main() 30 { 31 int i, m; 32 scanf("%d%d", &i, &n); 33 while(scanf("%d", &m), m != 3) 34 { 35 int x1, x2, y1, y2, num; 36 if(m == 1) 37 { 38 scanf("%d%d%d", &x1, &y1, &num); 39 x1++, y1++; 40 update(x1, y1, num); 41 } 42 else 43 { 44 scanf("%d%d%d%d", &x1, &y1, &x2, &y2); 45 x1++, y1++, x2++, y2++; 46 printf("%d\n", query(x2, y2) - query(x1 - 1, y2) - query(x2, y1 - 1) + query(x1 - 1, y1 - 1)); 47 } 48 } 49 return 0; 50 }