Description

Given an \(N \times 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 \leq i, j \leq 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 \leq x1 \leq x2 \leq n, 1 \leq y1 \leq y2 \leq 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 \leq x, y \leq n)\) querys \(A[x, y]\).

Input

The first line of the input is an integer \(X (X \leq 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 \leq N \leq 1000, 1 \leq T \leq 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

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

Source

POJ Monthly,Lou Tiancheng

Solution

题意简述:一个\(N \times N\)的\(01\)矩阵,和几种动态操作,包括对子矩阵\((x,y,xx,yy)\)的所有元素异或,查询某一点\((x,y)\)的元素值。

二维树状数组裸题。

异或的操作不难修改。

二维树状数组与一维树状数组不同的是:

  • 一维树状数组维护的是一条链,而二维树状数组维护的却是一片区域。
  • 一维树状数组更新和查找只有一重循环,而二维树状数组需要两重循环。
  • 二维树状数组比一维树状数组多一维度。

经过以上分析,\(AC\)代码就不难得出了。

Code

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype> using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
return f * x;
} int n, m, c[1003][1003], t;
bool fl = false; inline void add(int x, int y)//二维树状数组的修改操作
{
for (int i = x; i <= n; i = i + (i & (-i)))
{
for (int j = y; j <= n; j = j + (j & (-j)))//注意两重循环
{
++c[i][j];
}
}
} inline int getans(int x, int y)//二维树状数组的查询操作
{
int ans = 0;
for (int i = x; i; i = i - (i & (-i)))
{
for (int j = y; j; j = j - (j & (-j)))
{
ans = ans + c[i][j];//加上答案
}
}
return ans;
} int main()
{
int t = gi();
while (t--)
{
if (!fl) fl = true;
else puts("");
n = gi(), m = gi();
memset(c, 0, sizeof(c));
while (m--)
{
char c;
cin >> c;
if (c == 'C')
{
int x = gi(), y = gi(), xx = gi(), yy = gi();
add(x, y), add(xx + 1, y), add(x, yy + 1), add(xx + 1, yy + 1);//进行插入操作
}
else
{
int x = gi(), y = gi();
printf("%d\n", getans(x, y) % 2);//输出最终答案
}
}
}
return 0;//结束
}

题解【POJ2155】Matrix的更多相关文章

  1. [LeetCode 题解] Spiral Matrix

    前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 题目链接 54. Spiral Matrix ...

  2. POJ2155 Matrix 【二维线段树】

    题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...

  3. POJ2155 Matrix 【二维树状数组】+【段更新点查询】

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17766   Accepted: 6674 Descripti ...

  4. [poj2155]Matrix(二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25004   Accepted: 9261 Descripti ...

  5. [POJ2155]Matrix(二维树状数组)

    题目:http://poj.org/problem?id=2155 中文题意: 给你一个初始全部为0的n*n矩阵,有如下操作 1.C x1 y1 x2 y2 把矩形(x1,y1,x2,y2)上的数全部 ...

  6. POJ2155:Matrix(二维树状数组,经典)

    Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...

  7. C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速

    Matrix Power Series r时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定矩阵A,求矩阵S=A^1+A^2+--+A^k,输出矩阵,S矩阵中每个元都要模m. 数据范围: ...

  8. poj----2155 Matrix(二维树状数组第二类)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16950   Accepted: 6369 Descripti ...

  9. 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...

  10. POJ2155 Matrix(二维树状数组||区间修改单点查询)

    Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row an ...

随机推荐

  1. simmon effect(psychology experiment) : this time, we add file_function who can creat a file in the window which contains our result

    #the real experiment for simon effect #load the library which is our need import pygame import sys i ...

  2. DSP定点与浮点计算

    在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示.一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位.显然,字长越长,所能表示的数的范围越大,精度也越高 ...

  3. 转: OSIP协议栈使用入门

    转自百度文库 很长时间之前,简单粗略地看了下Osip,eXosip,ortp等并快速“封装”了一个Windows下的基于VC6的MFC的SIP软电话(全部源代码VC6工程文件及Lib库可在本Blog共 ...

  4. ubuntu 16.04.1上安装并使用nginx

    1.安装 sudo apt-get install nginx 2.这时候应该就已经启动了,跳到步骤4. 通过命令“ps -aux | grep nginx”看下是否启动 3.如果没有启动,可以使用命 ...

  5. double加减乘除

    //四舍五入 public static double toDecimal(Double num){ if(Double.isNaN(num) || num == null){ return 0; } ...

  6. 4P遇上了5P

    (1)4P工作要素:任何一位从业者,都应该好好想想自己工作的初衷是什么?你将自己所从事的工作又是定位在什么位置?而这份工作的视角又有多宽.多广?最后是你会在某个周期内完成工作或者是实现突破. (2)5 ...

  7. Win10安装2 —— 版本的选择与下载

    本文内容皆为作者原创,如需转载,请注明出处:https://www.cnblogs.com/xuexianqi/p/12368795.html 一:各个版本的区别 1.Windows10 Home(家 ...

  8. 数据预处理 | 通过 Z-Score 方法判断异常值

    判断异常值方法:Z-Score 计算公式 Z = (X-μ)/σ 其中μ为总体平均值,X-μ为离均差,σ表示标准差.z的绝对值表示在标准差范围内的原始分数与总体均值之间的距离.当原始分数低于平均值时, ...

  9. Codeforce 459A - Pashmak and Garden (已知两点求另外两点构成正方形)

    Pashmak has fallen in love with an attractive girl called Parmida since one year ago... Today, Pashm ...

  10. Application Characteristics Of LED Keychain

    LED keychains are essential camping and travel accessories. Very useful as a light source. There are ...