浅谈二维RMQ
针对一些二维区间最值问题,用一维RMQ来解决显然是不够的。所以,要改进算法。鉴于网上没有PASCAL版的RMQ标程与解析,所以小可在这里简单的讲一下。
核心思想和一维的一样,只是在计算区间时略有不同。用数组F[i,j,k]表示以i,j为左上角的矩形,长度为(1 shl k),然后在循环时取四个矩形的最值,具体伪代码如下:
for k:=1 to x do // x为要处理矩形的最大边长的trunc(log2max)值
for i:=1 to n+1-(1 shl k) do
for j:=1 to m+1-(1 shl k) do //循环上和一维的一样,只是多加了一层而已
f[i,j,k]:=max(f[i,j,k-1],f[i+1 shl (k-1),j,k-1],f[i,j+1 shl (k-1),k-1],f[i+1 shl (k-1),j+1 shl (k-1),k-1]);
// 分成四块正方形计算
查询时和一维的一样,这里不再详讲。
总的时间复杂度为O(logN*N2+M) 在这里将待处理矩形看做正方形,M为询问次数
提别提醒:因为循环次数较多,反复调用shl函数会导致常数变大,所以有时可以开一个数组预存要用到的值,以减少时间上的浪费。
"理想的正方形"就可以用以上方法完美的解决掉,时间略慢,附上代码
AC代码:
{
program zht;
var n,m,s,x,i,j,k,q,w,ans:longint;
f1,f2:array[0..1000,0..1000,0..7] of longint;
z:longint;
function mm(a,b:longint):longint;
begin if a>b then mm:=a else mm:=b;
end;
function max(a,b,c,d:longint):longint;
begin
max:=mm(mm(a,b),mm(c,d));
end;
function mmm(a,b:longint):longint;
begin
if a<b then mmm:=a else mmm:=b; end;
function min(a,b,c,d:longint):longint;
begin
min:=mmm(mmm(a,b),mmm(c,d));
end;
begin
assign(input,'square.in');
assign(output,'square.out');
reset(input);
rewrite(output);
readln(n,m,s);
for i:=1 to n do
for j:=1 to m do
begin
read(z);
f1[i,j,0]:=z;
f2[i,j,0]:=z;
end;
x:=trunc(ln(s)/ln(2));
for k:=1 to x do
for i:=1 to n+1-(1 shl k) do
for j:=1 to m+1-(1 shl k) do
begin
f1[i,j,k]:=max(f1[i,j,k-1],f1[i+1 shl (k-1),j,k-1],f1[i,j+1 shl (k-1),k-1],f1[i+1 shl (k-1),j+1 shl (k-1),k-1]); f2[i,j,k]:=min(f2[i,j,k-1],f2[i+1 shl (k-1),j,k-1],f2[i,j+1 shl (k-1),k-1],f2[i+1 shl (k-1),j+1 shl (k-1),k-1]);
end; // 两个存最值的数组预处理
ans:=maxlongint;
for i:=1 to n-s+1 do
for j:=1 to m-s+1 do
begin
q:=max(f1[i,j,x],f1[i+s-(1 shl x),j,x],f1[i,j+s-(1 shl x),x],f1[i+s-(1 shl x),j+s-(1 shl x),x]);
w:=min(f2[i,j,x],f2[i+s-(1 shl x),j,x],f2[i,j+s-(1 shl x),x],f2[i+s-(1 shl x),j+s-(1 shl x),x]);
ans:=mmm(q-w,ans); // 穷举顶点,计算最小差值
end;
writeln(ans);
close(input);
close(output);
end.
}
<Marvolo原创,严禁转载>
浅谈二维RMQ的更多相关文章
- hdu2888 二维RMQ
Check Corners Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hduacm 2888 ----二维rmq
http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题 直接用二维rmq 读入数据时比较坑爹 cin 会超时 #include <cstdio& ...
- hdu 2888 二维RMQ模板题
Check Corners Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 2888 Check Corners (模板题)【二维RMQ】
<题目链接> <转载于 >>> > 题目大意: 给出一个N*M的矩阵,并且给出该矩阵上每个点对应的值,再进行Q次询问,每次询问给出代询问子矩阵的左上顶点和右下 ...
- HDU2888 Check Corners(二维RMQ)
有一个矩阵,每次查询一个子矩阵,判断这个子矩阵的最大值是不是在这个子矩阵的四个角上 裸的二维RMQ #pragma comment(linker, "/STACK:1677721600&qu ...
- POJ 2019 Cornfields [二维RMQ]
题目传送门 Cornfields Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7963 Accepted: 3822 ...
- 【LightOJ 1081】Square Queries(二维RMQ降维)
Little Tommy is playing a game. The game is played on a 2D N x N grid. There is an integer in each c ...
- 【HDOJ 2888】Check Corners(裸二维RMQ)
Problem Description Paul draw a big m*n matrix A last month, whose entries Ai,j are all integer numb ...
- POJ 2019 Cornfields (二维RMQ)
Cornfields Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4911 Accepted: 2392 Descri ...
随机推荐
- 关于封装的一个小问题和TA的例子
写个小例子吧 -- 很多细节(如校验.判断等等)都略了 其实不是有意写成这样,而是很多朋友都这么写(当然里面也有点夸张的写法) 这么写其实也没什么不好,简单明了,不用动脑子,一看就很直白, 但是如果 ...
- 【算法】数组与矩阵问题——找到无序数组中最小的k个数
/** * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) * 过程: * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 * 在堆里的k个元素中堆顶的元素是最小的k个数 ...
- 对 const char* const &a 的理解
定义中用到&是独立引用. 比如: char i; char &a=i; 表示a是i的一个单独引用. 当有i='a'时,也有a='a'; 当有a='c'时,也有i='c'; 两个变量的标 ...
- iOS 视频播放横屏,隐藏状态栏
MPMoviePlayerViewController *moviePlayerViewController = [[MPMoviePlayerViewController alloc] init]; ...
- ios开发之xcode6中如何添加pch全局引用文件
xcode6中去掉了默认添加pch文件,这就需要我们自己手动添加pch文件了,添加pch文件是为了一些琐碎的头文件引用,加快编译速度! 下面就说下该如何手动添加pch文件: 1.添加一个文件,在oth ...
- C#遍历所有的Textbox控件并赋值为String.Empty
foreach (Control control in this.Controls) { if (control.GetType().Name.Equals("TextBox")) ...
- jQuery Tools:Web开发必备的 jQuery UI 库
基本介绍 jQuery Tools 是基于 jQuery 开发的网站界面库,包含网站最常用的Tabs(选项卡).Tooltip(信息提示).Overlay(遮罩.弹窗).Scrollable(滚动控制 ...
- 【转】C#正则表达式详解
正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter) 字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde&qu ...
- day11基础代码——函数指针
// // main.m // Demo11 // // Created by scjy on 15/10/29. // Copyright © 2015年 lizhipeng. All ri ...
- 实战EntityFramework
删除对象一定要在同一个context 我尝试这在两个方法中使用两个context(Container)实例来进行一个获得一个删除,结果我获得的”The object cannot be deleted ...