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;
}
posted @ 2019-04-11 15:58  易如鱼  阅读(168)  评论(0编辑  收藏  举报