Matrix
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 32921 | Accepted: 11933 |
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
12 10C 2 1 2 2Q 2 2C 2 1 2 1Q 1 1C 1 1 2 1C 1 2 1 2C 1 1 2 2Q 1 1C 1 1 2 1Q 2 1
Sample Output
1001
Source
,Lou Tiancheng
题目大意:给你一个初始都为0的n*n的矩阵,Cx1,y1,x2,y2,对这个小矩阵取反,即0->1,1->0,Qx1,y1,查询这个点为1还是0?
二维树状数组裸题
支持区间修改和单点查询
由于不能维护每个点的状态,但可以维护每个点的修改次数,若修改次数%2==0,则相当于不发生改变。
#include#include #include #include #include #include #include using namespace std;void in(int &x){ register char c=getchar();x=0;int f=1; while(!isdigit(c)){ if(c=='-') f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();} x*=f;}const int N=1005;int bit[N][N],t,m,n;int lowbit(int k){ return k&-k;}void add(int x,int y,int z){ int ty=y; while(x<=n){ y=ty; while(y<=n) bit[x][y]+=z,y+=lowbit(y); x+=lowbit(x); }}void change_interval(int x1,int y1,int x2,int y2){ add(x1,y1,1); add(x1,y2+1,-1); add(x2+1,y1,-1); add(x2+1,y2+1,1);}int ask(int x,int y){ int sum=0,ty=y; while(x>0){ y=ty; while(y>0) sum+=bit[x][y],y-=lowbit(y); x-=lowbit(x); }return sum;}int main(){ in(t); while(t--){ memset(bit,0,sizeof(bit)); in(n);in(m); for(int i=1,x1,y1,x2,y2;i<=m;i++){ char p; scanf("%c",&p);in(x1);in(y1); if(p=='C'){ in(x2);in(y2); change_interval(x1,y1,x2,y2); }else{ printf("%d\n",ask(x1,y1)%2); } }printf("\n");//注意,否则会PE }return 0;}