POJ2155Matrix(二维树状数组)

来源:互联网 发布:照片编辑软件下载 编辑:程序博客网 时间:2024/06/05 06:28

给出矩阵左上角和右下角坐标,矩阵里的元素 1变0 ,0 变1,然后给出询问,问某个点是多少

注意树状数组是向上更新!!

比如:

12 2C 1 1 4 4Q 1 1
这样一组数据

那么矩阵里面是这样的



#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int maxn = 1005;int C[maxn][maxn];int lowbit(int lo){    return lo & (-lo);}void modify(int i, int j, int value){    for(int x = i; x < maxn; x += lowbit(x))    {        for(int y = j; y < maxn; y += lowbit(y))        {            C[x][y] += value;        }    }}int getsum(int i, int j){    int sum = 0;    for(int x = i; x > 0; x -= lowbit(x))    {        for(int y = j; y > 0; y -= lowbit(y))        {            sum += C[x][y];        }    }    return sum;}int main(){    int T, n, que, x1, y1, x2, y2;    cin >> T;    char op[10];    while(T--)    {        scanf("%d%d", &n, &que);        memset(C, 0, sizeof(C));        for(int i = 1; i <= que; i++)        {            scanf("%s", op);            //cout << op[0] << endl;            if(op[0] == 'C')            {                scanf("%d%d%d%d", &x1, &y1, &x2, &y2);                x1++;y1++;x2++;y2++;                modify(x2, y2, 1);                modify(x1-1, y1-1, 1);                modify(x2, y1-1, 1);                modify(x1-1, y2, 1);            }            else            {                scanf("%d%d", &x1, &y1);                int ans = getsum(x1, y1) % 2;                cout << ans << endl;            }        }        printf("\n");    }    return 0;}


0 0