Fellow me on GitHub

POJ2155(二维树状数组)

Matrix

Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 17226   Accepted: 6461

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]. 

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. 

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. 

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

Source

POJ Monthly,Lou Tiancheng
 
题意:给出矩阵左上角和右下角坐标,矩阵里的元素 1变0 ,0 变1,然后给出询问,问某个点是多少
思路:二维树状数组
 1 //2017-10-25
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 
 7 using namespace std;
 8 
 9 const int N = 1100;
10 
11 int bt[N][N], n, q;
12 
13 int lowbit(int x){
14     return x&(-x);
15 }
16 
17 void add(int x, int y, int v){
18     while(x <= n){
19         int j = y;
20         while(j <= n){
21             bt[x][j] += v;
22             j += lowbit(j);
23         }
24         x += lowbit(x);
25     }
26 }
27 
28 int sum(int x, int y){
29     int sm = 0;
30     while(x > 0){
31         int j = y;
32         while(j > 0){
33             sm += bt[x][j];
34             j -= lowbit(j);
35         }
36         x -= lowbit(x);
37     }
38     return sm;
39 }
40 
41 int main()
42 {
43     int T;
44     cin>>T;
45     while(T--){
46         scanf("%d%d", &n, &q);
47         memset(bt, 0, sizeof(bt));
48         char op;
49         int x, y, x1, y1;
50         while(q--){
51             getchar();
52             scanf("%c%d%d", &op, &x, &y);
53             if(op == 'C'){
54                 scanf("%d%d", &x1, &y1);
55                 add(x, y, 1);
56                 add(x, y1+1, -1);
57                 add(x1+1, y, -1);
58                 add(x1+1, y1+1, 1);
59             }else{
60                 printf("%d\n", sum(x, y)%2);
61             }
62         }if(T)printf("\n");
63     }
64 
65     return 0;
66 }

 

posted @ 2017-10-25 21:40  Penn000  阅读(346)  评论(0编辑  收藏  举报