POJ 2155 Matrix (矩形)
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 28325 | Accepted: 10341 |
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
我们可以改变矩阵以以下方式。给定一个矩形的左上角(x1,y1),右下角(x2,y2),我们改变矩形中的所有元素用“不”操作(如果它是一个' 0 '然后改变它为' 1 '否则改变成“0”)。保持矩阵的信息,你被要求写一个程序接收和执行两种指令。
1。C(x1,y1 x2 y2 x1 < = x2(1 < = < = n,1 < = y1 < = y2 < = n)变化矩阵,利用矩形的左上角(x1,y1),右下角(x2,y2)。
2。Q x y(1 < = x,y < = n)查询(x,y)。
输入
每一块的第一行包含两个数N和T(2 < = N < = 1000,1 < = T < = 50000)代表矩阵的大小和数量的指示。以下T行每个代表一个指令的格式“Q x y”或“C x1 y1 x2 y2”,上面所描述的。
输出
之间有一个空行每两个连续的测试用例。
样例输入
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
样例输出
1
0
0
1
题解:据说本题是用数学方法来做,但是oycy大学霸+lsh大学霸好像在我写这篇题解之前已经研究了2个小时了……
再说那天的数学听得我对数学没有信心了,所以压根就没想到数学;
不是说数学不可以,但是太过困难了(深切感受),
一想到数学便睡意袭来,
然后大概花了40分钟便想出一个基于二维树状数组的思路:
现在我们设需要not变换的子矩阵左上坐标为(x1,y1)右下坐标(x2,y2)
不妨拓展1格,方便我们解题,先看到一幅图(拓展后)
注意到左上方有一个小黄人(这没什么用,请自行过滤)
黑方框为(0,0)
黑方框代表我们需要not的区域 红方框代表拓展出来的区域
TIPS:红方框边界上的点没画(lazy++),自己推吧,懒得画了,符合的。
在我的解题方案中,我们只要将点(橙框的4点)++
a[x1,y1]++
a[x2+1,y1]++
a[x1+1,y1]++
a[x2+1,y2+1]++
可以证明在黑方框外的任一点的二维前缀和的增量r mod 2 恒等于 0
而黑方框内的任一点的二维前缀和的增量r mod 2 恒等于 1
当然这是对于第一下C,当然基于第2~q次,同理,我们可以通过增量r mod 2=0 or 1,来判断该点到底是 1 还是 0
需要注意的,我们来简化问题,就是因为初始值为0所以我们不需要求坐标增量r只需要求出前缀和w即可
二维前缀和的最快维护方案是二维树状数组;具体维护不在多讲(本质是为树状数组+循环)
这样我们只要使4个点的权值++,维护前缀和,求Q(x,y)只要C(x,y)mod 2=1 则最终的点(x,y)就是1,反之就是0
做完了~~ 用not 来维护树状数组你就中陷阱了;
或者用dp来做,也是行不通的; 希望lsh+oycy大学霸orz能够早日用数学AC本题! 就是该算法的时间复杂度的分析在程序后,请自行查看。
代码:
uses math;
var n,m,i,j,t,x1,x2,y1,y2,q,x,y,tt,ii:longint;
c:array[..,..]of longint;
ch:char;
function lowbit(x:longint):longint;
begin
exit(x and (-x));
end;
procedure update(xx,yy,opx:longint);//二维树状数组把数组中a[xx]+yy并且跟新树状数组c[]
var ty,x,y:longint;
begin
x:=xx; y:=yy;
ty:=yy;
while x<=n do begin
y:=ty;
while y<=n do begin
c[x,y]:=c[x,y]+opx;
y:=y+lowbit(y);
end;
x:=x+lowbit(x);
end;
end;
function query(x,y:longint):longint;//询问a二维矩阵a[]前缀和
var sum,ty:longint;
begin
sum:=;
ty:=y;
while x> do begin
y:=ty;
while y> do begin
sum:=sum+c[x,y];
y:=y-lowbit(y);
end;
x:=x-lowbit(x);
end;
exit(sum);
end;
begin
readln(tt);//tt组数据
for ii:= to tt do begin
readln(n,q);//n*n矩阵,q个操作
for i:= to q do begin
read(ch);//ch为指示符
case ch of
'C':begin readln(x1,y1,x2,y2);
update(x1,y1,); update(x1,y2+,);
update(x2+,y1,); update(x2+,y2+,);//4个橙色的点依次更改
end;
'Q':begin readln(x,y); writeln(query(x,y) mod );end;//判断mod 2?=1
end;
end;
writeln;
end;
end.
我们来计算时间复杂度:
对于1次程序tt++前完成,q个询问,
如果是Q则复杂度是O(log n) 如果是C则复杂度为O(4 log n),最坏时间复杂度为O(4 log n)
那么对于1次完整的解决,我们最坏的时间复杂度为O (4q log n)
对于完整的tt次解决,最坏的时间复杂度是O(4*q*tt*log n)
2 <= N <= 1000, 1 <= q<= 50000; tt<=10;
那么最坏情况的常数为O(4*50000*10*10)=O(2000w)
没有超时,完美解决!
希望lsh+oycy大学霸orz能够早日用数学AC本题!

POJ 2155 Matrix (矩形)的更多相关文章
- POJ poj 2155 Matrix
题目链接[http://poj.org/problem?id=2155] /* poj 2155 Matrix 题意:矩阵加减,单点求和 二维线段树,矩阵加减,单点求和. */ using names ...
- POJ 2155 Matrix (D区段树)
http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 1 ...
- POJ 2155 Matrix【二维树状数组+YY(区间计数)】
题目链接:http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissio ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- poj 2155 Matrix (树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16797 Accepted: 6312 Descripti ...
- POJ 2155 Matrix
二维树状数组.... Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissio ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- POJ 2155 Matrix (二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17224 Accepted: 6460 Descripti ...
- POJ 2155 Matrix(树状数组+容斥原理)
[题目链接] http://poj.org/problem?id=2155 [题目大意] 要求维护两个操作,矩阵翻转和单点查询 [题解] 树状数组可以处理前缀和问题,前缀之间进行容斥即可得到答案. [ ...
随机推荐
- python 网页转pdf
主要使用的是wkhtmltopdf的Python封装——pdfkit centos环境 安装:Install python-pdfkit pip install pdfkit 安装:Install w ...
- MFC -- Excel操作简介(基于VS2010)
一.添加与 Excel 操作相关的头文件 项目 -> 类向导,在右上方有一个下拉栏,选择其中的 类型库中的MFC类(T),即可看到下图所示界面,选择“文件”选项,然后在下方的位置选项中添加本地文 ...
- python-python爬取豆果网(菜谱信息)
#-*- coding = utf-8 -*- #获取豆果网图片 import io from bs4 import BeautifulSoup import requests #爬取菜谱的地址 ur ...
- RN 离线包集成后需要注意的一些问题
1.ReactNative 开发中如何去掉iOS状态栏的"Loading from..." 等淡黑色的弹框,很难看? 在 AppDelegate.h 中引入: #import &l ...
- 安装hive的web界面
参考: http://blog.csdn.net/xinghalo/article/details/52433914 报错参考; http://blog.163.com/artsn@126/blog/ ...
- MySql 赋值操作符"="与":="
MySql小点心—1.赋值操作符"="与":=" 对于刚接触到mysql的程序员来说,会对这两个符号有疑问,因为会发现有的代码里用这个有的用另一个. 当然他们是 ...
- 互评Beta版本——二次元梦之队——“I Do”
基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 这是一款可以教学新手入门编程的软件,不断的通关让他们慢慢学会编程,可以让没有接触过编程的人了 ...
- 使用Git进行代码管理心得------------个人练习
一.在github.com上的操作 今天我们实践课程学习了用Git进行代码版本,使用github进行代码托管,我和队友在官网上创建了自己的Organization,将Auto CS fork到了小 ...
- 【转】python 三种遍历list的方法
[转]python 三种遍历list的方法 #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': list ...
- week2:个人博客作业
1.这周写程序感想: 昨天差不多,也是这个时候看些的程序,写了4个小时程序,感触颇多.昨日,原打算,就完成程序就吧这个随笔写完结果,由于各种原因,没写一直拖到现在.就做昨天写的程序,本身题目很简单,主 ...
