二维树状数组
给出矩阵左上角和右下角坐标,矩阵里的元素 1变0 ,0 变1,然后给出询问,问某个点是多少。
树状数组下标不能为0
二维的每次更新都是从(1,1)到(x,y)
要更新(x1,y1)到(x2,y2)的
update(x2,y2);
update(x2,y1-1);
update(x1-1,y2);
update(x1-1,y1-1);
sum%2==1 时为1。
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; #define N 1005 int arr[N][N],ans[N]; int lowbit(int x){ return x&-x; } void update(int x1,int y1) { int i,j,sum=0; for(i=x1;i<N;i+=lowbit(i)) for(j=y1;j<N;j+=lowbit(j)) { arr[i][j]++; } } int getsum(int x1,int y1) { int i,j,sum=0; for(i=x1;i>0;i-=lowbit(i)) for(j=y1;j>0;j-=lowbit(j)) sum+=arr[i][j]; return sum; } int main() { int n,m,t,i,j,k,ans,kk; int x1,y1,x2,y2; char c; scanf("%d",&n); kk=0; while(n--) { if(kk) printf("\n"); scanf("%d%d",&m,&t); memset(arr,0,sizeof(arr)); for(i=0;i<t;i++) { getchar(); scanf("%c",&c); if(c=='C') { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x1++;y1++;x2++;y2++; update(x2,y2); update(x2,y1-1); update(x1-1,y2); update(x1-1,y1-1); } else { scanf("%d%d",&x1,&y1); printf("%d\n",getsum(x1,y1)%2); } } kk=1; } return 0; }