问题描述
给出 N×N 的矩阵 A,其中的元素是 0 或 1。初始时均为 0。
我们可以修改矩阵,给定左上角(x1,y1),和右下角 (x2,y2),对这个矩阵的所有元素执行取反操作,即 0 变成 1,1 变成 0。现在我们一共有两种操作:
C x1 y1 x2 y2 (1≤x1≤x2≤n,1≤y1≤y2≤n),修改矩形
Q x y(1≤x,y≤n) 查询 Ax+…+Ay 的值
输入格式
第一行两个整数 N,T(2≤N≤1000,1≤T≤50000)。
接下来 T 行,每行一个操作。
输出格式
对于每个查询操作,一行一个整数表示 A(xy)。
样例输入
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
样例输出
1
0
0
1
AC代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX_N=1050;
int C[MAX_N][MAX_N];
int n;
int lowbit(int x){
return x&(-x);
}
void change(int i,int j){
for(int x=i;x<=n;x+=lowbit(x)){
for(int y=j;y<=n;y+=lowbit(y)){
if(C[x][y]==0)C[x][y]=1;
else C[x][y]=0;
}
}
return;
}
int getsum(int i,int j){
long long int res=0;
for(int x=i;x;x-=lowbit(x)){
for(int y=j;y;y-=lowbit(y)){
res+=C[x][y];
}
}
return res;
}
int main() {
memset(C,0,sizeof(C));
cin>>n;
int q;
cin>>q;
while(q--){
char t;
scanf(" %c",&t);
if(t=='C'){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
change(a,b);
change(a,d+1);
change(c+1,b);
change(c+1,d+1);
}
else{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",getsum(a,b)%2);
}
}
return 0;
}