您的位置:首页 > 其它

pku_2155_Matrix

2013-05-18 19:39 204 查看
楼教主出的题呀,二维树状数组入门经典.

题目大意:

给一个二维数组,初始都是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: