洛谷题目链接:[HAOI2007]理想的正方形

题目描述

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

输入输出格式

输入格式:

第一行为3个整数,分别表示a,b,n的值

第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。

输出格式:

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

输入输出样例

输入样例#1:

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

输出样例#1:

1

说明

问题规模

(1)矩阵中的所有数都不超过1,000,000,000

(2)20%的数据2<=a,b<=100,n<=a,n<=b,n<=10

(3)100%的数据2<=a,b<=1000,n<=a,n<=b,n<=100

一句话题意: 在一个\(n*m\)的矩阵中找一个大小为\(k\)的正方形使得这个正方形内的最大值与最小值的差值最小.

题解: 首先分析一下数据范围,显然这个算法的复杂度是\(O(n^2)\)的,然而这里需要统计的是最值,无法使用前缀和,所以这里考虑使用单调队列来维护.

既然是一个正方形,那么很显然在枚举到这个正方形的左上角的顶点的时候,这个正方形就已经可以确定了.所以我们可以竖着先求一遍最大/最小值,然后再用这个最大/最小值来求出一个正方形中的最大/最小值.

这里将每个位置向下\(k\)格的最大值/最小值用\(Mx[i][j]/Mn[i][j]\)存起来(即\(Mx[i][j] = max(a[i][j], a[i+1][j], ... , a[i+k-1][j])\), \(Mn[i][j]\)同理).

其实说白了就是先将每个位置求出连续的\(k\)个,也即是竖着求一遍滑动窗口,然后把这些连续的\(k\)个都看做一个个的格子,再横着求一遍滑动窗口.这个可以好好想想为什么.

#include<bits/stdc++.h>
using namespace std;
const int N=1000+5;
const int inf=2147483647;int n, m, k, a[N][N], Mx[N][N], Mn[N][N], mx[N], mn[N], h1, t1, h2, t2, ans = inf;int main(){ios::sync_with_stdio(false);cin >> n >> m >> k;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)cin >> a[i][j];for(int i=1; i<=m; i++){//竖着求最大值,保存到Mx[i][j]/Mn[i][j]中h1 = h2 = 1, t1 = t2 = 0;for(int j=1; j<=n; j++){while(h1 <= t1 && a[mx[t1]][i] <= a[j][i]) t1--;while(h2 <= t2 && a[mn[t2]][i] >= a[j][i]) t2--;mx[++t1] = mn[++t2] = j;while(h1 <= t1 && mx[h1]+k <= mx[t1]) h1++;while(h2 <= t2 && mn[h2]+k <= mn[t2]) h2++;if(j >= k) Mx[j-k+1][i] = a[mx[h1]][i], Mn[j-k+1][i] = a[mn[h2]][i];}}for(int i=1; i<=n-k+1; i++){h1 = h2 = 1, t1 = t2 = 0, mx[t1] = mn[t2] = 0;for(int j=1; j<=m; j++){while(h1 <= t1 && Mx[i][mx[t1]] <= Mx[i][j]) t1--;while(h2 <= t2 && Mn[i][mn[t2]] >= Mn[i][j]) t2--;mx[++t1] = mn[++t2] = j;while(h1 <= t1 && mx[h1]+k <= mx[t1]) h1++;while(h2 <= t2 && mn[h2]+k <= mn[t2]) h2++;if(j >= k) ans = min(ans, Mx[i][mx[h1]]-Mn[i][mn[h2]]);}}printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/BCOI/p/9166730.html

[HAOI2007] 理想的正方形相关推荐

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

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

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

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

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

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

  4. [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】

    题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...

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

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

  6. 【bzoj1047】[HAOI2007]理想的正方形 二维RMQ

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

  7. [HAOI2007] 理想的正方形 (单调队列)

    题目链接 Solution MD,经过这道题,算是掌握单调队列了... 可以先预处理出点 \((i,j)\) 往上 \(n\) 的最大值和最小值. 然后再横着做一遍单调队列即可. Code #incl ...

  8. [HAOI2007]理想的正方形

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

  9. BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞

    题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...

最新文章

  1. daz模型导入marvelous_传世工坊自制Daz Studio 4.10 系列入门教程
  2. 高效幂运算(JAVA)--拆分解法、二进制解法
  3. 32位与64位应用程序速度分析
  4. nodejs 端口被占解决
  5. 20165320 第七周学习总结
  6. 比较好用的门厂免费录单软件
  7. Matlab-rmdir函数无法删除文件夹解决方案
  8. 使用java生成折线图_Java折线图简单绘制
  9. 教你写能被舒服舒服又舒服地调用的iOS库
  10. NDS CA system和爱迪德CA系统
  11. 从罗永浩进军AR聊开
  12. 超低功耗研发-STM32L151C8T6芯片(三)RTC自动唤醒机制
  13. ZDNS .网址注册局发布2020年第二季度全球域名发展统计报告
  14. 火山PC百集基础教程(火山视窗)
  15. 已解决Idea创建maven工程没有src目录的情况
  16. 服务器散热风扇的制作流程,散热风扇生产操作工艺--制作流程
  17. 物联网专科专业必修课程_物联网专业大专课程 物联网工程学什么
  18. python爬取豆瓣电影信息可行性分析_Python爬虫实现的根据分类爬取豆瓣电影信息功能示例...
  19. rv1126如何切换720p和1080p
  20. [转载]校园背景音乐

热门文章

  1. SyntaxError: Non-UTF-8 code starting with ‘\xe4‘ in file解决办法
  2. 胡润2019中国人工智能企业百强榜:北京55家居首
  3. 新华社北京4月15日电 题:奋斗应提倡,996当退场
  4. linux shell顺序执行,shell 执行顺序
  5. php json encode html,php – json_encode不能使用html字符串作为值
  6. java继承的关键字_超级关键字在Java继承中的作用
  7. 056_Unicode字符官方标准七
  8. 001_FreeMarker介绍
  9. 013_CSS兄弟选择器
  10. 066_xhtml简介