1. 程式人生 > >【poj1195】Mobile phones(二維樹狀數組)

【poj1195】Mobile phones(二維樹狀數組)

單點 開始 str type algo while blog target hone

題目鏈接: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】Mobile phones(二維樹狀數組)