【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 }
本文介绍了解决POJ1195 Mobilephones问题的方法,利用二维树状数组进行单点更新和区域查询。文章提供了完整的C++代码实现,并解释了如何处理不同类型的输入操作。
245

被折叠的 条评论
为什么被折叠?



