POJ2155 Matrix

Posted ljh2000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ2155 Matrix相关的知识,希望对你有一定的参考价值。

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

 

 

本文作者:ljh2000 
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

 

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


正解:二维树状数组
解题报告:
  推荐:2009年国家集训队论文:《浅谈信息学竞赛中的“0”和“1”》
  我居然一开始没反应过来为什么只要改四个点就可以了QAQ
  考虑我支持的是一个修改标记,通过一维的情况可以类比推理二维的情况,yy一下可以想清楚的。

  
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int MAXN = 1011;
int n,m,c[MAXN][MAXN],x[2],y[2],ans;
char ch[12];
inline void add(int x,int y){ for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=n;j+=j&(-j)) c[i][j]++; }
inline int query(int x,int y){ int tot=0; for(int i=x;i>=1;i-=i&(-i)) for(int j=y;j>=1;j-=j&(-j)) tot+=c[i][j]; return tot; }
inline int getint(){
    int w=0,q=0; char c=getchar(); while((c<\'0\'||c>\'9\') && c!=\'-\') c=getchar();
    if(c==\'-\') q=1,c=getchar(); while (c>=\'0\'&&c<=\'9\') w=w*10+c-\'0\',c=getchar(); return q?-w:w;
}

inline void work(){
	int T=getint();
	while(T--){
		n=getint(); m=getint();
		memset(c,0,sizeof(c));
		while(m--) {
			scanf("%s",ch);
			if(ch[0]==\'C\') {
				x[0]=getint(); y[0]=getint();
				x[1]=getint(); y[1]=getint();
				add(x[0],y[0]);
				add(x[0],y[1]+1);
				add(x[1]+1,y[0]);
				add(x[1]+1,y[1]+1);
			}
			else{
				x[0]=getint(); y[0]=getint();
				ans=query(x[0],y[0]);
				printf("%d\\n",ans&1);
			}
		}
		printf("\\n");
	}	
}

int main()
{
    work();
    return 0;
}

  

以上是关于POJ2155 Matrix的主要内容,如果未能解决你的问题,请参考以下文章

POJ poj 2155 Matrix

poj 2155 Matrix

Matrix(poj2155)

poj 2155 Matrix

POJ-2155-Matrix二位树状数组应用

POJ2155 Matrix