楼教主出的题呀,二维树状数组入门经典.
题目大意:
给一个二维数组,初始都是0,有两个操作:
C x1,y1 x2,y2: 从坐标1到坐标2所有数异或1.
Q x,y : 询问坐标x,y的真假值.
解题思想:
题意可以转化为,求一个二维矩阵点从0,0到x,y的总和的奇偶性.更新的方法为 0,0到x2,y2 - 0,0到x1,y2 - 0,0到x2,y1 + 0,0到x1,y1,这个不难理解吧.
源代码:
#include <myhead>
const int maxn=1001;
int c[maxn][maxn];
int n;
int lowbit(int x) {
return x & (-x);
}
void add(int x, int y) {
while(x <= n) {
int ty = y;
while(ty <= n) {
c[x][ty] ^= 1;
ty += lowbit(ty);
}
x += lowbit(x);
}
}
int sum(int x, int y) {
int s = 0;
if(x > n) x = n;
if(y > n) y = n;
while(x >= 1) {
int ty = y;
while(ty >= 1) {
s ^= c[x][ty];
ty -= lowbit(ty);
}
x -= lowbit(x);
}
return s;
}
int main() {
int t, m;
int i, j;
scanf("%d", &t);
while(t--) {
scanf("%d %d", &n, &m);
memset(c, 0, sizeof(c));
while(m--) {
char str[5];
int x1, y1, x2, y2;
scanf("%s", str);
if(str[0] == 'C') {
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
add(x1, y1);
add(x2+1, y2+1);
add(x1, y2+1);
add(x2+1, y1);
}else {
scanf("%d %d", &x1, &y1);
printf( "%d\n", sum(x1, y1) );
}
}
if(t)
puts("");
}
return 0;
}