题目描述

有一个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;
}

转载于:https://www.cnblogs.com/GXZlegend/p/7491533.html

【bzoj1047】[HAOI2007]理想的正方形 二维RMQ相关推荐

  1. P2216 [HAOI2007]理想的正方形 ( 二维ST表 )

    题目链接:点击进入 题目 思路 maxx [ i ] [ j ] :左上角坐标 ( i , j ) ,边长为 2 k 2^k 2k 的正方形的最大值 minn [ i ] [ j ] :左上角坐标 ( ...

  2. bzoj1047 [HAOI2007]理想的正方形 单调队列

    这种在矩形里面找矩形有固定的套路,不是容斥就是左右上下延伸,这个题就是向左向右延伸.. 然后手玩优化发现邻位转移比暴力要好一些,可以用splay统计,但复杂度不对 然后由于每一行互不影响于是可以单行同 ...

  3. 理想的正方形 HAOI2007(二维RMQ)

    理想的正方形 省队选拔赛河南  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master       题目描述 Description 有一个a*b的整数组成的矩阵,现 ...

  4. P2216 [HAOI2007]理想的正方形(二维RMQ)

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

  5. P2216 [HAOI2007]理想的正方形

    P2216 [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. a,b<=1000 分析 ...

  6. [HAOI2007] 理想的正方形

    洛谷题目链接:[HAOI2007]理想的正方形 题目描述 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行 ...

  7. bzoj 1047: [HAOI2007]理想的正方形

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3324  Solved: 1828 [Submit][ ...

  8. 小程序生成二维码,正方形二维码,跟小程序码

    data:{ qrimg: " ", showCodeImg:true, } wx.request({ url: app.globalData.siteurlh5 +'/api/a ...

  9. luogu P2216 [HAOI2007]理想的正方形 递推+ST表

    题意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 数据规模: (1)矩阵中的所有数都不超过1,000,000,000 (2)20% ...

最新文章

  1. LeetCode简单题之生成每种字符都是奇数个的字符串
  2. python粘性拓展_Python基础之:拓展解决问题的思路
  3. cent os 6 fdisk fat32
  4. 2018年区块链技术发展总结与展望(附报告全文) | 起风研究院
  5. 《Head First Python》第四章--持久存储
  6. 【渝粤题库】国家开放大学2021春3924★汽车电器设备构造与检修题目
  7. pyqt5 自定义控件_PyQt5学习笔记(十六)Pyinstaller打包与SQLite数据库
  8. Spark Streaming源码分析 – DStream
  9. 微课|中学生可以这样学Python(8.4节):递归算法例题讲解1
  10. 遥感动态监测实验(以福州为例)
  11. 无缓冲I/O与有缓冲I/O区别
  12. centos7网络配置总结
  13. 怎么做一个企业级的BI项目?三步教你迅速搭建
  14. 《计算机网络教程》(微课版 第五版) 第二章 物理层 课后习题及答案
  15. Python 实现王者荣耀自动刷金币
  16. 【Web】HTML(No.06)表格标签经典案例《小说排行榜》
  17. CSRF, XSS攻击
  18. CVPR 2018 论文解读(部分)
  19. http中的scheme和小程序中的scheme
  20. B站声音太小怎么办,一款插件帮你解决

热门文章

  1. 将代码部署到 GitHub Pages 的快速简易方法
  2. idou老师教你学istio:监控能力介绍
  3. 一些大厂的css reset 代码
  4. JDK/Java SE官方文档汇总
  5. 在两个不同域中的WINDOWS 2003活动目录做迁移笔记
  6. 路由 RIP 协议 和 滞空路由
  7. json:JSONObject包的具体使用(JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包)...
  8. Linux系统管理第六周作业【Linux微职位】
  9. Spring 基础概念——DI、IOC(一)
  10. 工作那些事儿(8)- 废旧立新