【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 }

 

posted @ 2018-02-26 23:26  LesRoad  阅读(306)  评论(0编辑  收藏  举报