Description
Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1 <= i, j <= N).Input
The first line of the input is an integer X (X <= 10) representing the number of test cases. The following X blocks each represents a test case.Output
For each querying output one line, which has an integer representing A[x, y].Sample Input
1 2 10 C 2 1 2 2 Q 2 2 C 2 1 2 1 Q 1 1 C 1 1 2 1 C 1 2 1 2 C 1 1 2 2 Q 1 1 C 1 1 2 1 Q 2 1
Sample Output
1 0 0 1
思路:看到別人的代碼才做出來的,感覺這種思想太厲害了,用2維樹狀數組來維護頂點出現的次數,每加入一個矩形,就把四個頂點加進去(注意邊界問題,x2,y2要加一)。查詢的時候就算出(1,1)到(x,y)的頂點的總數,奇數就為1,偶數就是0。
#includeint sum[1005][1005],n,m; int lowbit(int x) { return x&-x; } void update(int x,int y) { for(int i=x;i<=n;i+=lowbit(i)) { for(int j=y;j<=n;j+=lowbit(j)) { sum[i][j]++; } } } int query(int x,int y) { int t=0; for(int i=x;i>0;i-=lowbit(i)) { for(int j=y;j>0;j-=lowbit(j)) { t+=sum[i][j]; } } return t&1; } int main() { int T,i,j,x1,y1,x2,y2; char s[5]; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=n;j++) sum[i][j]=0; while(m--) { scanf("%s",s); if(s[0]=='C') { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); update(x1,y1); update(x1,y2+1); update(x2+1,y2+1); update(x2+1,y1); } else { scanf("%d%d",&x1,&y1); printf("%d\n",query(x1,y1)); } } printf("\n"); } }