POJMatrix(二维树状数组)
Matrix
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 22058 | Accepted: 8219 |
Description
Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1 <= i, j <= N).
We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions.
1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2).
2. Q x y (1 <= x, y <= n) querys A[x, y].
We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions.
1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2).
2. Q x y (1 <= x, y <= n) querys A[x, y].
Input
The first line of the input is an integer X (X <= 10) representing the number of test cases. The following X blocks each represents a test case.
The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above.
The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above.
Output
For each querying output one line, which has an integer representing A[x, y].
There is a blank line between every two continuous test cases.
There is a blank line between every two continuous test cases.
Sample Input
1 2 10 C 2 1 2 2 Q 2 2 C 2 1 2 1 Q 1 1 C 1 1 2 1 C 1 2 1 2 C 1 1 2 2 Q 1 1 C 1 1 2 1 Q 2 1
Sample Output
1 0 0 1
二维树状数组,跟一维的差不多,
这个道题的思路就是看看x1,y1往上加一,同时方块右边,下面和右下方的区域再加1,只要保证他们那边加个偶数就可以了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int MAX = 1000 + 5; 7 int c[MAX][MAX]; 8 int n; 9 int lowbit(int k) 10 { 11 return k & (-k); 12 } 13 void update(int x,int y,int num) 14 { 15 for(int i = x; i < n; i += lowbit(i)) 16 { 17 for(int j = y; j < n; j += lowbit(j)) 18 c[i][j] += num; 19 } 20 } 21 int sum(int x,int y) 22 { 23 int s = 0; 24 for(int i = x; i > 0; i -= lowbit(i)) 25 { 26 for(int j = y; j > 0; j -= lowbit(j)) 27 s += c[i][j]; 28 } 29 return s; 30 } 31 int main() 32 { 33 int t,q; 34 int num = 0; 35 scanf("%d", &t); 36 while(t--) 37 { 38 if(num ++) 39 printf("\n"); 40 scanf("%d%d", &n,&q); 41 memset(c,0,sizeof(c)); 42 char ch; 43 int x1,y1,x2,y2; 44 getchar(); 45 while(q--) 46 { 47 scanf("%c", &ch); 48 if(ch == 'Q') 49 { 50 scanf("%d%d", &x1,&y1); 51 getchar(); 52 int m = sum(x2,y2) - sum(x1 - 1, y2) - sum(x2,y1 - 1) + sum(x1-1,y1-1); 53 if(m % 2 == 0) 54 printf("0\n"); 55 else 56 printf("1\n"); 57 } 58 else if(ch == 'C') 59 { 60 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 61 getchar(); 62 update(x1,y1,1); 63 } 64 } 65 } 66 return 0; 67 }