点击打开链接
题意:
给你一个n*n的矩阵(由0或1组成),有两种操作,C x1,y1,x2,y2将两个点组成的矩阵取反。Q x,y,求x,y这一点的值。。。
对于求一点的值,只需要求跟这一点有关的之后的位置翻转多少次就可以。。。
#include"stdio.h" #include"string.h" #define N 1005 int C[N][N]; int n; int bit(int x) { return x&(-x); } int sum(int x,int y) { int ans=0; for(int i=x;i>0;i-=bit(i)) { for(int j=y;j>0;j-=bit(j)) ans+=C[i][j]; } return ans; } void update(int x,int y,int a) { for(int i=x;i<=n;i+=bit(i)) { for(int j=y;j<=n;j+=bit(j)) C[i][j]=C[i][j]+a; } } int main() { int T; int m; int i; char s; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); memset(C,0,sizeof(C)); for(i=0;i<m;i++) { getchar(); scanf("%c",&s); if(s=='C') { int x1,x2,y1,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x2++;y2++; update(x2,y2,1); update(x1,y1,1); update(x2,y1,-1); update(x1,y2,-1); } else { int x,y; scanf("%d%d",&x,&y); printf("%d\n",1&sum(x,y)); } } printf("\n"); } return 0; }