原题链接:https://www.luogu.com.cn/problem/P2216

理想的正方形

题目描述

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

输入格式

第一行为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

题解

二维的滑动窗口,先对每一行做一次横向的滑动窗口,求出每一行长为nnn的窗口滑过的最小/大值,再对求出的最小/大值做一次纵向的滑动窗口,这样求出的就是二维的n×nn\times nn×n的窗口覆盖的最小/大值。

代码

看起来多,实际上都是复制粘贴的,一遍过针不戳。

#include<bits/stdc++.h>
using namespace std;
const int M=1e3+5;
int n,a,b,que[M],sqr[M][M],mn[M][M],mx[M][M],mn2[M][M],mx2[M][M],head,tail;
void hori(int x)
{que[head=tail=1]=1;if(n==1)mn[x][1]=sqr[x][1];for(int i=2;i<=b;++i){for(;sqr[x][que[tail]]>=sqr[x][i]&&tail>=head;--tail);que[++tail]=i;for(;i-que[head]+1>n&&head<=tail;++head);if(i>=n)mn[x][i]=sqr[x][que[head]];}que[head=tail=1]=1;if(n==1)mx[x][1]=sqr[x][1];for(int i=2;i<=b;++i){for(;sqr[x][que[tail]]<=sqr[x][i]&&tail>=head;--tail);que[++tail]=i;for(;i-que[head]+1>n&&head<=tail;++head);if(i>=n)mx[x][i]=sqr[x][que[head]];}
}
void verti(int x)
{que[head=tail=1]=1;if(n==1)mn2[1][x]=mn[1][x];for(int i=2;i<=a;++i){for(;mn[que[tail]][x]>=mn[i][x]&&tail>=head;--tail);que[++tail]=i;for(;i-que[head]+1>n&&head<=tail;++head);if(i>=n)mn2[i][x]=mn[que[head]][x];}que[head=tail=1]=1;if(n==1)mx2[1][x]=mx[1][x];for(int i=2;i<=a;++i){for(;mx[que[tail]][x]<=mx[i][x]&&tail>=head;--tail);que[++tail]=i;for(;i-que[head]+1>n&&head<=tail;++head);if(i>=n)mx2[i][x]=mx[que[head]][x];}
}
void in()
{scanf("%d%d%d",&a,&b,&n);for(int i=1;i<=a;++i)for(int j=1;j<=b;++j)scanf("%d",&sqr[i][j]);
}
void ac()
{for(int i=1;i<=a;++i)hori(i);for(int i=n;i<=b;++i)verti(i);int ans=INT_MAX;for(int i=n;i<=a;++i)for(int j=n;j<=b;++j)ans=min(ans,mx2[i][j]-mn2[i][j]);printf("%d\n",ans);
}
int main()
{in(),ac();system("pause");
}

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

  1. [HAOI2007] 理想的正方形

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. [HAOI2007]理想的正方形

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

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

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

最新文章

  1. 一起学习手撕包菜如何做 - 生活至上,美容至尚!
  2. 计算机excel行高在哪里,如何在Excel2016中设置改行高和列宽?
  3. xfce4终端的字体颜色修改
  4. 【软件工程】设计原则与设计模式
  5. Get 和 Post方法的登录
  6. Centos 网络配置
  7. WPF:Documents文档--Annomation批注(1)
  8. 20161212xlVBA文本文件多列合并
  9. office visio 2007 画流程图
  10. t分布 u分布 卡方分布_四个分布:正态分布/卡方分布/F分布/T分布
  11. Ubuntu 部署Django, Wagtail,Postgres, Nginx, Gunicorn,Supervisor
  12. word 参考文献插入整理
  13. 新媒传信Java_新媒小课堂——多媒体、流媒体、富媒体
  14. JAVA POI 对excel加密后 无法打开的解决办法
  15. 高品质摄影作图台式计算机推荐,摄影后期做图用什么电脑
  16. ADAMoracle预言机将数据传至链上实现区块链落地应用
  17. 【codeforces】Round #269 ABCD
  18. Cannot run program “F:\JetBrains\IntelliJ IDEA 2021.1\jbr\bin\java.exe“ (in
  19. 【C++】C++标准库之iomanip库(格式输入输出)
  20. 2015第六届蓝桥杯 C/C++C组真题及题解

热门文章

  1. Hvv近期0day总结四
  2. Starting zookeeper ... already running as process 30988.
  3. linux6的关机快捷键是,LINUX关机快捷键是什么?
  4. python_迭代器、生成器
  5. 对于PHP面试知识点的小结
  6. LeetCode Sparse Matrix Multiplication
  7. 接口”安全机制”的设计
  8. react navigation传值给上一页面
  9. XXXfragment that is not a fragment错误,fragment认不出来
  10. LightOj 1088 - Points in Segments (二分枚举)