C - Matrix POJ - 2155(二维版B - Color the ball HDU - 1556
思想和上一题一模一样,不过是二维树状数组+差分数组
注意二维区间修改的表示:
add( x1 ,y1 ,1);
add( x2+1 ,y2+1 ,1);
add( x1 ,y2+1 ,-1);
add( x2+1 ,y1 ,-1);
#include <cstdio> #include <cstring> using namespace std; int n; int t[1005][1005]; int lowbit( int x){ return x & ( -x); } void add( int x, int y ,int v){ while( x<=n){ int i=y; while( i<=n ){ t[x][i] += v; i += lowbit( i); } x += lowbit(x); } } int sum( int x, int y){ int s=0; while( x > 0 ){ int i=y; while( i > 0 ){ s +=t[x][i]; i -= lowbit( i); } x -= lowbit(x); } return s; } int main( ){ int T; scanf("%d" ,&T); while( T--){ memset( t ,0 ,sizeof(t)); int q; char op[10]; int x1, x2 ,y1 ,y2; scanf("%d%d" ,&n ,&q); while( q--){ scanf( "%s" ,op); if( op[0] == 'C'){ scanf("%d%d%d%d",&x1 ,&y1 ,&x2 ,&y2); add( x1 ,y1 ,1); add( x2+1 ,y2+1 ,1); add( x1 ,y2+1 ,-1); add( x2+1 ,y1 ,-1); } else{ scanf("%d%d" ,&x1 ,&y1); printf("%d\n",sum( x1 ,y1)%2); } } printf("\n"); } return 0; }