【POJ1195】【二维树状数组】Mobile phones
Description
Write a program, which receives these reports and answers queries about the current total number of active mobile phones in any rectangle-shaped area.
Input
The values will always be in range, so there is no need to check them. In particular, if A is negative, it can be assumed that it will not reduce the square value below zero. The indexing starts at 0, e.g. for a table of size 4 * 4, we have 0 <= X <= 3 and 0 <= Y <= 3.
Table size: 1 * 1 <= S * S <= 1024 * 1024
Cell value V at any time: 0 <= V <= 32767
Update amount: -32768 <= A <= 32767
No of instructions in input: 3 <= U <= 60002
Maximum number of phones in the whole table: M= 2^30
Output
Sample Input
0 4 1 1 2 3 2 0 0 2 2 1 1 1 2 1 1 2 -1 2 1 1 2 3 3
Sample Output
3 4
【分析】
不说了,最基本的二维树状数组
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #include <utility> 7 #include <iomanip> 8 #include <string> 9 #include <cmath> 10 #include <map> 11 12 const int MAXN = 100000 * 2 + 10; 13 const int N=1050; 14 using namespace std; 15 16 int n, array[N][N]; 17 18 int lowbit(int x){return x & (-x);} 19 void add(int i, int j, int w) { 20 int tmp; 21 while(i <= n){ 22 tmp=j; 23 while(tmp <= n){ 24 array[i][tmp] += w; 25 tmp += lowbit(tmp); 26 } 27 i += lowbit(i); 28 } 29 } 30 31 int sum(int i, int j){ 32 int tmp, ans=0; 33 while(i > 0){ 34 tmp=j; 35 while(tmp > 0){ 36 ans += array[i][tmp]; 37 tmp -= lowbit(tmp); 38 } 39 i -= lowbit(i); 40 } 41 return ans; 42 } 43 44 int main(){ 45 #ifdef LOCAL 46 freopen("data.txt", "r", stdin); 47 freopen("out.txt", "w", stdout); 48 #endif 49 int op, x1, y1, x2, y2, w; 50 memset(array, 0, sizeof(array)); 51 while( ~scanf("%d", &op) ){ 52 if(op == 0){ 53 scanf("%d", &n); 54 n++; 55 }else if(op == 1){ 56 scanf("%d%d%d", &x1, &y1, &w); 57 add(x1 + 1, y1 + 1, w); 58 }else if(op == 2){ 59 scanf("%d%d%d%d", &x1, &y1, &x2, &y2); 60 int ans=sum(x2 + 1, y2 + 1) - sum(x1, y2 + 1) - sum(x2 + 1, y1) + sum(x1, y1); 61 printf("%d\n", ans); 62 }else if(op == 3) 63 break; 64 } 65 return 0; 66 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。