POJ 2155 Matrix【二维树状数组+YY(区间计数)】
题目链接:http://poj.org/problem?id=2155
Matrix
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 32950 | Accepted: 11943 |
Description
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 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
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
题意概括:
有一个初始值为0的N*N的二维矩阵,有T次操作,每次操作有两种选择:
C : 修改以(x1, y1)为左上角(x2, y2)为右下角的矩阵的值(0和1互换)
Q:查询(x, y)的值为 0 或者 为 1;
解题思路:
涉及到多次区间修改和区间查询的优先考虑线段树和树状数组,这道题巧妙之处在于灵活运用树状数组的前缀和,把区间修改转换单点修改,一维需要标记两个点而二维需要标记四个点,一个点用于发挥效果,另外三个点用于消除效果,因为树状数组维护的是前缀和,而对于二维树状数组,查询的则是以(1,1)为左上角,(x,y)为右下角的矩阵的和。
第二就是我们可以借助修改次数的奇偶性来判断该点的值为 0 / 1;
例如:N = 3;C:x1 = 1, y1 = 1, x2 = 2, y2 = 2;
1 | 1 | |
(x,y) | ||
1 | 1 |
(因为我们只需要知道奇偶性,所以矩阵外的点加1即可消除效果)
AC code:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define ll long long int;
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 1e3+; int mmp[MAXN][MAXN];
int N, T; int lowbit(int x)
{
return x&(-x);
} void add(int x, int y, int value)
{
for(int i = x; i <= N; i += lowbit(i))
for(int j = y; j <= N; j += lowbit(j))
mmp[i][j]+=value;
} int sum(int x, int y)
{
int res = ;
for(int i = x; i > ; i -= lowbit(i))
for(int j = y; j > ; j -= lowbit(j))
res+=mmp[i][j];
return res;
} void init()
{
for(int i = ; i <= N; i++)
for(int j = ; j <= N; j++)
mmp[i][j] = ;
} int main()
{
int T_case;
char com[];
int x, y, x1, x2, y1, y2;
scanf("%d", &T_case);
while(T_case--)
{
scanf("%d%d", &N, &T);
init();
while(T--)
{
scanf("%s", &com);
if(com[] == 'C')
{
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
add(x1, y1, );
add(x2+, y1, );
add(x1, y2+, );
add(x2+, y2+, );
}
else if(com[] == 'Q')
{
scanf("%d%d", &x, &y);
int res = ;
res = sum(x, y);
// printf("res: %d\n", res);
if(res%) printf("1\n");
else printf("0\n");
}
}
puts("");
}
return ;
}
POJ 2155 Matrix【二维树状数组+YY(区间计数)】的更多相关文章
- POJ 2155 Matrix(二维树状数组,绝对具体)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20599 Accepted: 7673 Descripti ...
- poj 2155 Matrix (二维树状数组)
题意:给你一个矩阵开始全是0,然后给你两种指令,第一种:C x1,y1,x2,y2 就是将左上角为x1,y1,右下角为x2,y2,的这个矩阵内的数字全部翻转,0变1,1变0 第二种:Q x1 y1,输 ...
- POJ 2155:Matrix 二维树状数组
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 21757 Accepted: 8141 Descripti ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- [poj2155]Matrix(二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25004 Accepted: 9261 Descripti ...
- 【poj2155】Matrix(二维树状数组区间更新+单点查询)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- POJ 2029 (二维树状数组)题解
思路: 大力出奇迹,先用二维树状数组存,然后暴力枚举 算某个矩形区域的值的示意图如下,代码在下面慢慢找... 代码: #include<cstdio> #include<map> ...
- poj----2155 Matrix(二维树状数组第二类)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16950 Accepted: 6369 Descripti ...
- POJ2155【二维树状数组,区间修改,点查询?】【又被输入输出坑】
这题反反复复,到现在才过. 这道题就是树状数组的逆用,用于修改区间内容,查询点的值. 如果单纯就这个奇偶数来判的话,似乎这个思路比较好理解. 看了一下国家集训队论文(囧),<关于0与1在信息学奥 ...
随机推荐
- web服务器架构演化及所其技术知识体系(分布式的由来)
文章标题是我自己取的,内容来着百度百科k5665219的一篇回答,觉得讲的很不错就转载过来了. 最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们 ...
- API 接口收集
节假日 http://api.goseek.cn/ http://timor.tech/api/holiday http://www.easybots.cn/api/holiday.php?d=201 ...
- 你的UI设计够不够趣味性
这周要做一个设计,在研究怎么修改的时候,想到了要加入一些符合产品调性的趣味设计,但是要怎么加入才能增加用户对产品的印象,进而增加好感与认可呢,我们今天就来研究一下很多有意思的APP里的一些趣味设计. ...
- vue中添加util公共方法&&ES6之import、export
vue中添加util公共方法&&ES6之import.export https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Re ...
- oracle客户端中文乱码问题的解决
1 查看服务器端编码 select userenv('language') from dual; 我实际查看到的结果为: USERENV('LANGUAGE') ------------------- ...
- pom.xml无法引入本地的jar和安装到本地安装maven 错误: 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher
今天maven突然无法引入本地maven库的jar包,导致maven工程出错,然后就准备重装maven ,开始只是将环境变量删除,将之前的压缩包解压,再重新配置环境 变量,可是配置好后在dos窗口 输 ...
- [转]How to use IHttpContextAccessor in static class to set cookies
本文转自:http://stackoverflow.com/questions/37329354/how-to-use-ihttpcontextaccessor-in-static-class-to- ...
- python之高阶函数filter
原文 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返 ...
- c# 字体库跨域解决
网上大部分的资料说的都是在apache和ng服务器的情况下解决方案,但基本的思路都是添加响应头 场景: 页面引用css文件: <link href="http://www.tuohua ...
- IDEA+Maven+多个SpringBoot子模块(创建多模块整合项目)
https://blog.csdn.net/willjgl/article/details/77773634 https://blog.csdn.net/qqHJQS/article/details/ ...