题意: 给一个矩阵,给出行列和每个数,再给出一个N,求出所有N*N的子矩阵中最大值最小值之差的最小值
解析: 暴力枚举肯定不行,这题可以用二维单调队列做,把同一行的连续N个点缩成一个点保存最大最小值预处理
,用单调队列即可实现,再对整个矩阵进行枚举,再用一次单调队列。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int INF=1e9+;
const int maxn=;
int row,col,N;
int A[maxn][maxn];
int Min[maxn][maxn],Max[maxn][maxn];
int q1[maxn],q2[maxn];
int f1,f2,r1,r2;
void init() //预处理
{
for(int i=;i<=row;i++)
{
f1=,r1=;
f2=,r2=;
for(int j=;j<N;j++)
{
while(r1>=f1&&A[i][q1[r1]]>=A[i][j]) r1--;
q1[++r1]=j;
while(r2>=f2&&A[i][q2[r2]]<=A[i][j]) r2--;
q2[++r2]=j;
}
for(int j=N;j<=col;j++)
{
while(r1>=f1&&A[i][q1[r1]]>=A[i][j]) r1--;
q1[++r1]=j;
while(q1[f1]+N<=j) f1++;
Min[i][j-N+]=A[i][q1[f1]]; //缩点后的最小值 while(r2>=f2&&A[i][q2[r2]]<=A[i][j]) r2--;
q2[++r2]=j;
while(q2[f2]+N<=j) f2++;
Max[i][j-N+]=A[i][q2[f2]]; //缩点后的最大值
}
}
}
int solve()
{
int ret=INF;
for(int j=;j+N-<=col;j++) //对同一列进行枚举
{
f1=,r1=;
f2=,r2=;
int minv=INF,maxv=-INF;
for(int i=;i<N;i++)
{
while(r1>=f1&&Min[q1[r1]][j]>=Min[i][j]) r1--;
q1[++r1]=i;
while(r2>=f2&&Max[q2[r2]][j]<=Max[i][j]) r2--;
q2[++r2]=i;
}
for(int i=N;i<=row;i++)
{
while(r1>=f1&&Min[q1[r1]][j]>=Min[i][j]) r1--;
q1[++r1]=i;
while(q1[f1]+N<=i) f1++;
minv=Min[q1[f1]][j];
while(r2>=f2&&Max[q2[r2]][j]<=Max[i][j]) r2--;
q2[++r2]=i;
while(q2[f2]+N<=i) f2++;
maxv=Max[q2[f2]][j];
ret=min(ret,maxv-minv);
}
}
return ret;
}
int main()
{
scanf("%d%d%d",&row,&col,&N);
for(int i=;i<=row;i++)
for(int j=;j<=col;j++) scanf("%d",&A[i][j]);
init();
printf("%d\n",solve());
return ;
}

bzoj1047-理想的正方形(二维单调队列)的更多相关文章

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

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

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

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

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

    [题目大意] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [思路] 裸的二维单调队列.二维单调队列的思路其实很简单: (1)对于每 ...

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

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

  5. [luoguP2216] [HAOI2007]理想的正方形(二维单调队列)

    传送门 1.先弄个单调队列求出每一行的区间为n的最大值最小值. 2.然后再搞个单调队列求1所求出的结果的区间为n的最大值最小值 3.最后扫一遍就行 懒得画图,自己体会吧. ——代码 #include ...

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

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

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

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

  8. [HAOI2007]理想的正方形 st表 || 单调队列

    ~~~题面~~~ 题解: 因为数据范围不大,而且题目要求的是正方形,所以这道题有2种解法. 1,st表. 这种解法暴力好写好理解,但是较慢.我们设st[i][j][k]表示以(i, j)为左端点,向下 ...

  9. BZOJ 1047 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...

随机推荐

  1. MYSQL触发器学习笔记

    课程学至金色晨曦科技公司技术总监沙利穆 触发器 1.       什么是触发器 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执 ...

  2. MVC 4.0语法 自动分页

    4.0语法中实现自动分页只需要两个方法即可,Skip() ----跳过序列中指定的元素,Take()-----从序列的开头返回指定数量元素. 一般用自动分页都是无刷新的,可以把显示的数据,用局部页面封 ...

  3. Collision使用 获取其组件执行变色操作

    using UnityEngine; using System.Collections; public class CyCollision : MonoBehaviour { void OnColli ...

  4. paip.提升用户体验---c++ qt 取消gcc编译的警告信息.txt

    paip.提升用户体验---c++ qt 取消gcc编译的警告信息.txt 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http:// ...

  5. -bash: mysql: command not found 解决办法 (转)

    root@DB-02 ~]# mysql -u root-bash: mysql: command not found 原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下 ...

  6. web开发小白之路

    今天就来谈谈本人从事web开发的一系列白只又白的经历,本人刚开始是从事ios开发的,由于一系列的变故现在变为了web前端开发,不过说来也奇怪,刚开始接触前端时间可以说是彻底蒙圈,各种选择器,各种适配搞 ...

  7. Maven初识

    说说maven,我们每做一个项目,都要往lib目录扔很多jar包,spring的啊hibernate的啊apache的啊等等,这样就会导致很多包不知从哪个角落下载回来的,名称千奇百怪,版本也不明,项目 ...

  8. C#中静态构造函数含义及使用

    static以前都接触过,可是最近才发现了还有静态类的写法,也可能是以前没太注意了,所以自己去研究了一下! 1.什么是构造函数: 1.1 例如:static  Class{} 1.2 使用静态函数的注 ...

  9. 2015版Force Touch Mac Book激活三个手指拖动窗口

    新买的2015版的Mac Book Pro,一切都好,就是原来一直很的很习惯的三个手指拖动窗口的手势,突然找不到地方设置了,很是让我失望了一把,在想苹果怎么会把这么有用的手势去掉了呢.还好有万能的Go ...

  10. JS将图片文件转为64位字符串再post到接口上传图片

    HTML: <div class="ai-item upload-id-img"> <p>上传身份证照片</p> <div class=& ...