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].
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.
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.
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
- poj 2155 Matrix
- poj 2155 Matrix
- poj 2155 Matrix
- Poj 2155 Matrix
- poj 2155 Matrix
- POJ 2155 Matrix
- POJ 2155 - Matrix
- poj 2155 Matrix
- POJ 2155 Matrix
- Poj 2155 Matrix
- POJ-2155-Matrix
- POJ 2155: Matrix
- poj 2155 Matrix
- POJ 2155 Matrix
- poj 2155 Matrix
- POJ 2155 Matrix
- POJ 2155 Matrix
- poj 2155 Matrix
- 【即时通讯】XMPP调试与简单使用
- #pragma分析
- C++学习——copy构造函数所涉及匿名对象的问题
- TCP/IP实现以及常见问题
- spring-boot通用配置文件整理
- POJ 2155 Matrix
- 一次快速排序错误引发的思考
- cocos2d-x 进度条实现(被砍)掉血效果
- Linux命令大观
- C/C++高阶语法:函数指针及其应用
- 避免用char类型作为数组小标
- hdu 5532 Almost Sorted Array
- sapi_module_struct 研究(一)
- LeetCode:Rectangle Area