Matrix(poj2155)

Matrix

Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 25139   Accepted: 9314

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

思路:二维树状数组;

http://download.csdn.net/detail/lenleaves/4548401

这个解释的很好;

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<stdlib.h>
 5 #include<queue>
 6 #include<string.h>
 7 using namespace std;
 8 int bit[1005][1005];
 9 int lowbit(int x)
10 {
11         return x&(-x);
12 }
13 void add(int x,int y)
14 {
15         int i,j;
16         for(i = x; i <= 1000; i+=lowbit(i))
17         {
18                 for(j = y; j <= 1000; j+=lowbit(j))
19                 {
20                         bit[i][j]+=1;
21                         bit[i][j]%=2;
22                 }
23         }
24 }
25 int ask(int x,int y)
26 {
27         int i,j;
28         int sum = 0;
29         for(i = x; i > 0; i-=lowbit(i))
30         {
31                 for(j = y; j > 0; j-=lowbit(j))
32                 {
33                         sum += bit[i][j];
34                 }
35         }
36         return sum%2;
37 }
38 int main(void)
39 {
40         int T;
41         scanf("%d ",&T);
42         while(T--)
43         {
44                 memset(bit,0,sizeof(bit));
45                 int i,j;
46                 int N,q;
47                 scanf("%d %d ",&N,&q);
48                 char a[10];
49                 while(q--)
50                 {
51                         scanf("%s",a);
52                         int x,y,x1,y1;
53                         if(a[0] == ‘C‘)
54                         {
55                                 scanf("%d %d %d %d",&x,&y,&x1,&y1);
56                                 add(x,y);
57                                 add(x1+1,y1+1);
58                                 add(x,y1+1);
59                                 add(x1+1,y);
60                         }
61                         else
62                         {
63                                 scanf("%d %d",&x,&y);
64                                 int ac = ask(x,y);
65                                 printf("%d\n",ac);
66                         }
67                 }
68                 printf("\n");
69         }
70         return 0;
71 }
时间: 2025-01-04 15:10:01

Matrix(poj2155)的相关文章

Matrix.(POJ-2155)(树状数组)

一道二维树状数组的题目,比较经典,适合新手练习. 可以打印出来每次操作后矩阵的情况,就能很直观的理解这个树状数组是怎么实现的,他将多余的部分巧妙的重复了偶数次,使得多余部分奇偶不会发生变化. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<map&

POJ2155 Matrix 【二维树状数组】+【段更新点查询】

Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17766   Accepted: 6674 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

poj2155 Matrix 【二维树状数组】

有工具在手,这题就是一个模板题,就是有点不清楚,最后问的是单个元素的值,它怎么sum求出来的 #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; #define maxn 1005 int c[maxn][maxn]; int Row, Col; inline int Lowbit(const int &x)

POJ2155 Matrix 二维树状数组的应用

有两种方法吧,一个是利用了树状数组的性质,很HDU1556有点类似,还有一种就是累加和然后看奇偶来判断答案 题意:给你一个n*n矩阵,然后q个操作,C代表把以(x1,y1)为左上角到以(x2,y2)为右下角的矩阵取反,意思就是矩阵只有0,1元素,是0的变1,是1的变0,Q代表当前(x,y)这个点的状况,是0还是1? 区间修改有点特别,但是若区间求和弄懂了应该马上就能懂得: add(x2,y2,1); add(x2,y1,-1);//上面多修改了不需要的一部分,所以修改回来 add(x1,y2,-

树状数组(二)与poj2155 - matrix

今天下午,我进行了树状数组的进一步学习[1],并完成了poj2155的编程与调试,下面是一些记录与感想. 这道题目是一道二维树状数组的练习,中心思想如下: 1.C(x1, y1)(x2, y2)可以用c[x1][y1]++.c[x2 + 1][y1]++.c[x1][y1 + 1]--.c[x2 + 1][y2 + 1]--进行记录(证明与推理过程在注释[1]中). 2.Q(x, y)利用二维树状数组对c[1][1]到c[x][y]的累加和%2(即mod 2)求得(请各位参看注释[1]的资料自行

poj2155 Matrix 二维数组数组

http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18769   Accepted: 7078 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. I

[poj2155]Matrix(二维树状数组)

Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25004   Accepted: 9261 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

POJ2155:Matrix(二维树状数组,经典)

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 upp

【POJ2155】【二维树状数组】Matrix

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 upp