码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2155 Matrix

时间:2017-01-13 10:26:08      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:pre   eof   vector   nbsp   ems   rip   std   cpp   ade   

本文版权归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

标签:pre   eof   vector   nbsp   ems   rip   std   cpp   ade   

原文地址:http://www.cnblogs.com/ljh2000-jump/p/6277326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!