poj 2155 Matrix

Matrix
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 36547   Accepted: 13109

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

 

二维线段树,不需要懒标记。 

修改和查询都是$O(logn*logn)$。 

 1 #include<iostream>
 2 #include<cstring> 
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm> 
 6 using namespace std;  
 7 #define lch  (x<<1) 
 8 #define rch  (x<<1|1)  
 9 #define mid  (l+r)/2 
10 int const N=1000+10;  
11 int t[N<<2][N<<2],cas,n,m,ans;  
12 void insert(int o,int x,int l,int r,int y1,int y2){
13     if(y1<=l && r<=y2) {
14         t[o][x]^=1;  
15         return;  
16     }
17     if(y1<=mid) insert(o,lch,l,mid,y1,y2);  
18     if(y2>mid)  insert(o,rch,mid+1,r,y1,y2);  
19 }
20 void update(int x,int l,int r,int x1,int y1,int x2,int y2){
21     if(x1<=l && r<=x2){
22         insert(x,1,1,n,y1,y2);    
23         return ; 
24     }    
25     if(x1<=mid) update(lch,l,mid,x1,y1,x2,y2);  
26     if(x2>mid)  update(rch,mid+1,r,x1,y1,x2,y2);  
27 }  
28 void queryy(int o,int x,int l,int r,int rr){
29     ans^=t[o][x];  
30     if(l==r) return ;  
31     if(rr<=mid) queryy(o,lch,l,mid,rr);  
32     else queryy(o,rch,mid+1,r,rr);  
33 }
34 void queryx(int x,int l,int r,int ll,int rr){
35     queryy(x,1,1,n,rr);  
36     if(l==r) return ; 
37     if(ll<=mid) queryx(lch,l,mid,ll,rr);  
38     else queryx(rch,mid+1,r,ll,rr);  
39 }  
40 int main(){
41     scanf("%d",&cas);  
42     int check=0;  
43     while (cas--){
44         if(check) printf("\n");  
45         scanf("%d%d",&n,&m);  
46         memset(t,0,sizeof(t));   
47         while (m--){  
48             char s[2];  
49             scanf("%s",s);  
50             if(s[0]=='Q'){
51                 int x,y; 
52                 scanf("%d%d",&x,&y);  
53                 ans=0;  
54                 queryx(1,1,n,x,y);  
55                 printf("%d\n",ans);  
56             }else {
57                 int x1,y1,x2,y2;  
58                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);  
59                 update(1,1,n,x1,y1,x2,y2);  
60             } 
61         }
62         check=1; 
63     }
64     return 0; 
65 }
View Code

 

posted @ 2020-01-28 22:01  zjxxcn  阅读(194)  评论(0编辑  收藏  举报