题目描述

有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。

输入

第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
100%的数据2<=a,b<=1000,n<=a,n<=b,n<=1000

输出

仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。

样例输入

5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2

样例输出

1


题解

二维RMQ

说RMQ过不去的站出来。。。我打肿他的脸。。。

由于查询区域是个正方形,因此我们不用对两维分别倍增,而是一起倍增,令$mx/mn[i][j][k]$表示从$(i,j)$向右下的$2^k*2^k$的区域内的最大/最小值。

预处理方法与一维RMQ一样,只不过变成4个更新1个。。。

然后就没有然后了。。。

时间复杂度$O(ab\log n)$。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1010
using namespace std;
int v[N][N] , mx[11][N][N] , mn[11][N][N] , k;
int main()
{
int a , b , n , i , j , ans = 1 << 30 , maxn , minn;
scanf("%d%d%d" , &a , &b , &n);
for(i = 1 ; i <= a ; i ++ )
for(j = 1 ; j <= b ; j ++ )
scanf("%d" , &v[i][j]) , mx[0][i][j] = mn[0][i][j] = v[i][j];
for(k = 1 ; (1 << k) <= n ; k ++ )
for(i = 1 ; i <= a - (1 << k) + 1 ; i ++ )
for(j = 1 ; j <= b - (1 << k) + 1 ; j ++ )
mx[k][i][j] = max(max(mx[k - 1][i][j] , mx[k - 1][i][j + (1 << (k - 1))]) , max(mx[k - 1][i + (1 << (k - 1))][j] , mx[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]))
, mn[k][i][j] = min(min(mn[k - 1][i][j] , mn[k - 1][i][j + (1 << (k - 1))]) , min(mn[k - 1][i + (1 << (k - 1))][j] , mn[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]));
k -- ;
for(i = 1 ; i <= a - n + 1 ; i ++ )
for(j = 1 ; j <= b - n + 1 ; j ++ )
maxn = max(max(mx[k][i][j] , mx[k][i][j + n - (1 << k)]) , max(mx[k][i + n - (1 << k)][j] , mx[k][i + n - (1 << k)][j + n - (1 << k)]))
, minn = min(min(mn[k][i][j] , mn[k][i][j + n - (1 << k)]) , min(mn[k][i + n - (1 << k)][j] , mn[k][i + n - (1 << k)][j + n - (1 << k)]))
, ans = min(ans , maxn - minn);
printf("%d\n" , ans);
return 0;
}

【bzoj1047】[HAOI2007]理想的正方形 二维RMQ的更多相关文章

  1. BZOJ1047[HAOI2007]理想的正方形——二维ST表

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...

  2. 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列

    题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...

  3. [BZOJ1047][HAOI2007]理想的正方形 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 我们对每矩阵的一列维护一个大小为$n$的单调队列,队中元素为矩阵中元素.然后扫描每一 ...

  4. bzoj1047 [HAOI2007]理想的正方形——二维单调队列

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 就是先对行做一遍单调队列,再对那个结果按列做一遍单调队列即可. 代码如下: #incl ...

  5. BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  6. bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形

    http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...

  7. [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列

    理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...

  8. [Bzoj1047][HAOI2007]理想的正方形(ST表)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 题目虽然有一个n的限制,但求二维区间最值首先想到的还是RMQ,但是如果按照往常RM ...

  9. [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)

    题意 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 思路 RMQ求 再DP 代码 #include<cstdio> #i ...

随机推荐

  1. ES6初识-模块化

    export let A=123; export function test(){ console.log('test'); } export class Hello(){ test(){ conso ...

  2. 堆(heap)和栈(stack)几点认识

    堆(heap)和栈(stack)主要的区别由以下几点:1.管理方式不同:2.空间大小不同:3.产生碎片不同:4.生长方向不同:5.分配归属不同:6.分配效率不同:7.存取效率不同:管理方式:对于栈来讲 ...

  3. 基于mybatis设计简单OA系统问题2

    1.<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <fm ...

  4. Servlet学习笔记07——什么是cookie,session?

    7)cookie的路径问题 a.什么是cookie路径问题? 浏览器在向服务器上的某个地址发送请求时, 会查看cookie的路径是否与该地址匹配,只有 匹配的cookie才会被发送. b.cookie ...

  5. 在haoodp-2.7.3 HA的基础上安装Hbase HA

    前提安装好hadoop基于QJM的高可用 node1 HMaster node2 HMaster.HRegionServer node3 HRegionServer node4 HRegionServ ...

  6. TA-LIB】之MACD

    移动平滑异同平均线(Moving Average Convergence Divergence,简称MACD指标)策略.MACD是查拉尔·阿佩尔(Geral Appel)于1979年提出的,由一快及一 ...

  7. OLAP和OLTP

    OLTP与OLAP的介绍 数据处理分为两种技术架构系统:OLTP与OLAP OLTP(联机事务处理过程) OLTP是传统的关系型数据库的主要应用,主要是基本的,日常的事务处理,例如银行的交易     ...

  8. <Docker学习>6. docker使用网络

    在容器中部署一个web应用,外部如何访问? 容器与容器间如何访问? 外部访问容器 容器可以运行一些网络应用,让外部也可以访问的话,需要进行服务器和容器的端口映射 -p 或者 -P -P默认会分配一个4 ...

  9. Python学习笔记:sqlite3(sqlite数据库操作)

    对于数据库的操作,Python中可以通过下载一些对应的三方插件和对应的数据库来实现数据库的操作,但是这样不免使得Python程序变得更加复杂了.如果只是想要使用数据库,又不想下载一些不必要的插件和辅助 ...

  10. keil5的安装及问题

    win8+keil 注意,在进行破解的时候首先要打开一个工程,而且keil要用管理员的身份进行运行, 才可以破解完成 发现打开之后,出现这样的错误. 原因是因为在创建工程的时候在下图中点了是,要点否才 ...