POJ 2155 Matrix

来源:互联网 发布:fanuc编程软件 编辑:程序博客网 时间:2024/06/18 03:42

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).

We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions.

1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2).
2. Q x y (1 <= x, y <= n) querys A[x, y].

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.

The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above.

Output

For each querying output one line, which has an integer representing A[x, y].

There is a blank line between every two continuous test cases.

Sample Input

12 10C 2 1 2 2Q 2 2C 2 1 2 1Q 1 1C 1 1 2 1C 1 2 1 2C 1 1 2 2Q 1 1C 1 1 2 1Q 2 1

Sample Output

1001

Source

POJ Monthly,Lou Tiancheng



给定一个n*n的矩阵,值全为0.每次更新的话是将x1,y1,x2,y2里面的元素的0变成1,1变成0.二维线段树。查询(x,y)节点的值。就是树套树。

#include <cstdio>#include <cstring>#include <algorithm>using namespace std ;#define clear( A , X ) memset ( A , X , sizeof A )#define lson l , m , o << 1#define rson m + 1 , r , o << 1 | 1#define LxRxLyRy Lx , Rx , Ly , Ryconst int maxN = 1005 ;bool sum[ maxN << 2 ][ maxN << 2 ] ;int n;void YUpdate ( int L, int R , int l , int r , int o , int x ){    if ( L <= l && r <= R ) sum[ x ][ o ] ^= 1 ;    else    {        int m = ( l + r ) >> 1 ;        if ( L <= m ) YUpdate ( L , R , lson , x ) ;        if ( m <  R ) YUpdate ( L , R , rson , x ) ;    }}void XUpdate ( int Lx , int Rx , int Ly , int Ry , int l , int r , int o ){    if ( Lx <= l && r <= Rx )    {        YUpdate ( Ly , Ry , 1 , n , 1 , o ) ;    }    else    {        int m = ( l + r ) >> 1 ;        if ( Lx <=  m ) XUpdate ( LxRxLyRy , lson ) ;        if ( m  <  Rx ) XUpdate ( LxRxLyRy , rson ) ;    }}bool YQuery ( int Y , int l , int r , int o , int x ){    bool ans = 0 ;    ans ^= sum[ x ][ o ] ;    if ( l == r ) return ans;    int m = ( l + r ) >> 1;    if ( Y <= m ) ans ^= YQuery ( Y , lson , x ) ;    else          ans ^= YQuery ( Y , rson , x ) ;    return ans ;}bool XQuery ( int X , int Y , int l , int r , int o ){    bool ans = 0 ;    ans ^= YQuery ( Y , 1 , n , 1 , o ) ;    if ( l == r ) return ans;    int m = ( l + r ) >> 1 ;    if ( X <= m ) ans ^= XQuery ( X , Y , lson ) ;    else          ans ^= XQuery ( X , Y , rson ) ;    return ans ;}void work ( int m ){    clear ( sum , 0 ) ;    char ch[ 5 ] ;    int x1 , y1 , x2 , y2 , X , Y;    while ( m -- )    {        scanf ( "%s" , ch ) ;        if ( ch[ 0 ] == 'C' )        {            scanf ( "%d%d%d%d" , &x1 , &y1 , &x2 , &y2 ) ;            XUpdate ( x1 , x2 , y1 , y2 , 1 , n , 1 ) ;        }        if ( ch[ 0 ] == 'Q' )        {            scanf ( "%d%d" , &X, &Y ) ;            printf ( "%d\n" , XQuery ( X , Y , 1 , n , 1 ) ) ;        }    }}int main (){    int m , T ;    for ( scanf ( "%d" , &T ) ; T ; -- T )    {        scanf ( "%d%d" , &n , &m ) ;        work ( m ) ;        if ( T > 1 ) printf ( "\n" ) ;    }    return 0 ;}

0 0
原创粉丝点击