POJ 2155 Matrix

来源:互联网 发布:数据统计表格怎么做 编辑:程序博客网 时间:2024/04/28 00:32

二维树状数组。每个矩阵翻转后令从四个角为左上角到[n,n]为右下角矩阵+1或-1。以记录翻转次数。所有与要查询点有关的翻转都在当前点为右下角的矩阵中。求和模2即可求出结果。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 1005
int n;
int c[N][N];


int lowbit(int x) {
    return x & (-x) ;
}


int sum(int x,int y) {
    int sum = 0;
    int x0 = x , y0 = y;
    while(x > 0) {
        y = y0;
        while(y > 0) {
            sum += c[x][y];
            y -= lowbit(y);
        }
        x -= lowbit(x);
    }
    return sum;
}


void add(int x , int y , int d) {
    int x0 = x , y0 = y;
    while(x <= n) {
        y = y0;
        while(y <= n) {
            c[x][y] += d;
            y += lowbit(y);
        }
        x += lowbit(x);
    }
}


int main()
{
    int num;
    scanf("%d" , &num);
    char ch;
    int t;
    while(num --) {
        memset(c,0,sizeof(c));
        scanf("%d%d" , &n , &t);
        for(int i = 0 ; i < t ; i ++) {
            getchar();
            scanf("%c" , &ch);
            if(ch == 'C') {
                int x1 , y1 , x2 , y2;
                scanf("%d%d%d%d" , &x1 , &y1 , &x2 , &y2);
                add (x2+1 , y2+1 , 1);
                add (x1 , y2+1 , -1);
                add (x2+1 , y1 , -1);
                add (x1 , y1 , 1);
            }
            else {
                int x , y;
                scanf("%d%d" , &x , &y);
                printf("%d\n" , (sum(x , y)&1));
            }
        }
        printf("\n");
    }


    return 0;
}

0 0