您的位置:首页 > 其它

POJ 2155 Matrix 二维树状数组 区间更新,单点查询

2017-10-20 12:28 267 查看
给出矩阵左上角和右下角坐标,矩阵里的元素 1变0 ,0 变1,然后给出询问,问某个点是多少

小技巧:1,0变换,我们不停地+1即可,最后%2输出。

这道题是二维树状数组的题目

     

#include<cstdio>  

#include<cstring>  

#include<iostream>  

#include<algorithm>  

#include<cstdlib>  

#include<cmath>  

#define N 1040  

#define ll long long  

  

using namespace std;  

  

int n;  

  

int bit

;  

  

int sum(int i,int j) {  

    int s=0;  

    while(i>0) {  

        int jj=j;  

        while(jj>0) {  

            s+=bit[i][jj];  

            jj-=jj&-jj;  

        }  

        i-=i&-i;  

    }  

    return s;  

}  

  

void add(int i,int j,int x) {  

    while(i<=n) {  

        int jj=j;  

        while(jj<=n) {  

            bit[i][jj]+=x;  

            jj+=jj&-jj;  

        }  

        i+=i&-i;  

    }  

}  

  

int main() {  

    freopen("test.in","r",stdin);  

    int t;  

    cin>>t;  

    while(t--) {  

        int q;  

        scanf("%d%d ",&n,&q);  

        memset(bit,0,sizeof bit);  

        char c;  

        int x,y,x1,y1;  

        while(q--) {  

            scanf("%c",&c);  

            if(c=='C') {  

                scanf("%d%d%d%d",&x,&y,&x1,&y1);  

                add(x,y,1);  

                add(x,y1+1,-1);  

                add(x1+1,y,-1);  

                add(x1+1,y1+1,1);

            } else {  

                scanf("%d%d",&x,&y);  

                printf("%d\n",sum(x,y)%2);  

            }  

            getchar();  

        }  

        if(t)printf("\n");  

    }  

    return 0;  

}  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐