POJ 2155 Matrix (二维树状数组)

Matrix

Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 17224 Accepted: 6460

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

 

很裸的题。

可以使用二维树状数组。

二维的写起来很方便,两重循环。

如果是要修改(x1,y1)  –  (x2,y2)的矩形区域。

那么可以在(x1,y1) 出加1,在(x2+1,y1)处加1,在(x1,y2+1)处加1,在(x2+1,y2+1)处加1 。。

 

画个图就知道了,查询单点就是求和。

 1 /* ***********************************************
 2 Author        :kuangbin
 3 Created Time  :2014/5/23 22:34:04
 4 File Name     :E:\2014ACM\专题学习\数据结构\二维树状数组\POJ2155.cpp
 5 ************************************************ */
 6 
 7 #include <stdio.h>
 8 #include <string.h>
 9 #include <iostream>
10 #include <algorithm>
11 #include <vector>
12 #include <queue>
13 #include <set>
14 #include <map>
15 #include <string>
16 #include <math.h>
17 #include <stdlib.h>
18 #include <time.h>
19 using namespace std;
20 const int MAXN = 1010;
21 int lowbit(int x)
22 {
23     return x&(-x);
24 }
25 int c[MAXN][MAXN];
26 int n;
27 int sum(int x,int y)
28 {
29     int ret = 0;
30     for(int i = x;i > 0;i -= lowbit(i))
31         for(int j = y;j > 0;j -= lowbit(j))
32             ret += c[i][j];
33     return ret;
34 }
35 void add(int x,int y,int val)
36 {
37     for(int i = x;i <= n;i += lowbit(i))
38         for(int j = y;j <= n;j += lowbit(j))
39             c[i][j] += val;
40 }
41 
42 int main()
43 {
44     //freopen("in.txt","r",stdin);
45     //freopen("out.txt","w",stdout);
46     int T;
47     scanf("%d",&T);
48     while(T--)
49     {
50         int q;
51         scanf("%d%d",&n,&q);
52         memset(c,0,sizeof(c));
53         char op[10];
54         int x1,y1,x2,y2;
55         while(q--)
56         {
57             scanf("%s",op);
58             if(op[0] == 'C')
59             {
60                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
61                 add(x1,y1,1);
62                 add(x2+1,y1,1);
63                 add(x1,y2+1,1);
64                 add(x2+1,y2+1,1);
65             }
66             else
67             {
68                 scanf("%d%d",&x1,&y1);
69                 if(sum(x1,y1)%2 == 0)printf("0\n");
70                 else printf("1\n");
71             }
72         }
73         if(T > 0)printf("\n");
74     }
75     return 0;
76 }

 

 

 

 

 

 

 

 

 

 

 

 

 

    原文作者:kuangbin
    原文地址: https://www.cnblogs.com/kuangbin/p/3749030.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞