针对一些二维区间最值问题,用一维RMQ来解决显然是不够的。所以,要改进算法。鉴于网上没有PASCAL版的RMQ标程与解析,所以小可在这里简单的讲一下。

   核心思想和一维的一样,只是在计算区间时略有不同。用数组F[i,j,k]表示以i,j为左上角的矩形,长度为(1 shl k),然后在循环时取四个矩形的最值,具体伪代码如下:

  for k:=1 to x do              // x为要处理矩形的最大边长的trunc(logmax)值
    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*N+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的更多相关文章

  1. hdu2888 二维RMQ

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. hduacm 2888 ----二维rmq

    http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题  直接用二维rmq 读入数据时比较坑爹  cin 会超时 #include <cstdio& ...

  3. hdu 2888 二维RMQ模板题

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. HDU 2888 Check Corners (模板题)【二维RMQ】

    <题目链接> <转载于 >>> > 题目大意: 给出一个N*M的矩阵,并且给出该矩阵上每个点对应的值,再进行Q次询问,每次询问给出代询问子矩阵的左上顶点和右下 ...

  5. HDU2888 Check Corners(二维RMQ)

    有一个矩阵,每次查询一个子矩阵,判断这个子矩阵的最大值是不是在这个子矩阵的四个角上 裸的二维RMQ #pragma comment(linker, "/STACK:1677721600&qu ...

  6. POJ 2019 Cornfields [二维RMQ]

    题目传送门 Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7963   Accepted: 3822 ...

  7. 【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 ...

  8. 【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 ...

  9. POJ 2019 Cornfields (二维RMQ)

    Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4911   Accepted: 2392 Descri ...

随机推荐

  1. 让ie6/7/8兼容css3的圆角阴影等特殊效果的方法 PIE1.0.0及placeholder在这些IE下生效的方法

    PIE地址:http://css3pie.com/ 使用方法1: #login,#AnnouncementBox {  border:3px solid #fff;  -webkit-border-r ...

  2. 常用的dos命令之简略总结

    Dos常用命令  一.基础命令  1 dir  无参数:查看当前所在目录的文件和文件夹.  /s:查看当前目录已经其所有子目录的文件和文件夹.  /a:查看包括隐含文件的所有文件.  /ah:只显示出 ...

  3. Notification和KVO有什么不同

    Notification是推送通知,我们可以建立一个通知中心,存放创建多个通知,在不同的地方在需要的时候push调用和KVO不同的是,KVO是键值观察,只能观察一个值,这就是区别

  4. hdoj 1251 字典树

    代码: #include <stdio.h>#define  MAX    26 typedef struct TrieNode{     int nCount;      struct ...

  5. 330. Patching Array--Avota

    问题描述: Given a sorted positive integer array nums and an integer n, add/patch elements to the array s ...

  6. asp.net gridview中增加单击单元格事件

    实现功能:单击表格中某个单元格(不是第一列.最后一列.最后一行,不为0)根据行第一个单元格内容及列名来查询详细内容,在消息框中查看显示. 在代码中增加 protected override void ...

  7. jQuery height()、innerHeight()、outerHeight()函数的区别

    参考: http://www.365mini.com/tech 函数 高度范围 jQuery版本 支持写操作 height() height 1.0+ 1.0+ innerHeight() heigh ...

  8. linux下搭建svn服务器

    安装步骤如下: 1.yum install subversion   2.输入rpm -ql subversion查看安装位置,如下图:   我们知道svn在bin目录下生成了几个二进制文件. 输入 ...

  9. 理解Python的*args, **kwargs

    1 # coding=utf-8 2 def speak(*args, **kwargs): 3 print args, kwargs 4 5 6 a = 1 7 b = 2 8 c = 3 9 sp ...

  10. 【转】app后端如何选择合适的数据库产品

    转自:http://blog.csdn.net/newjueqi/article/details/44003503 app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis ...