这是楼教主出的二维线段树或者是二维树状数组的题,题意很简单,就是有个n*n的矩阵,初始值都是0,然后给你两个操作,一个是给你左上角和右下角的坐标,把这个长方形的区间所有元素反取反(0变1 1变0),另一个是求某个具体坐标的值。
这里我用了二维的线树状数组,一维树状数组可以解决区间更新和点查询的问题,这里只需要加一维就可以了,代码比较好写,不过开始犯了很多低级的错误。
//============================================================================ // Name : 2012083101.cpp // Author : xindoo // Version : // Copyright : Your copyright notice // Description : poj 2155 // Data : 2013-08-29-17.06 //============================================================================ #include <stdio.h> #include <string.h> const int maxn = 1004; int xy[maxn][maxn]; int n; inline int lowbit(int x) { return x&-x; } void update(int x, int y, int v) { int t = y; while (x <= n) { y = t; while (y <= n) { xy[x][y] += v; y += lowbit(y); } x += lowbit(x); } } int getsum(int x, int y) { int sum = 0; int t = y; while (x) { y = t; while (y) { sum += xy[x][y]; y -= lowbit(y); } x -= lowbit(x); } return sum; } int main() { int q, kase; char op; int x1, x2, y1, y2; scanf("%d", &kase); while (kase--) { scanf("%d %d", &n, &q); memset(xy, 0, sizeof(xy)); while (q--) { getchar(); scanf("%c", &op); if (op == 'Q') { scanf("%d %d", &x1, &y1); int t = getsum(x1, y1); if (t&1) printf("%d\n", 1); else printf("%d\n", 0); } else { scanf("%d %d %d %d", &x1, &y1, &x2, &y2); update(x1, y1, 1); update(x1, y2+1, -1); update(x2+1, y1, -1); update(x2+1, y2+1, 1); } } if (kase) puts(""); } return 0; }