题意: 给一个矩阵,给出行列和每个数,再给出一个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. 常用cl命令参数解释

    紧接前文,第一行cl命令如下: 1> cl /c /IC:\...\include /ZI /nologo- /W3 /WX- /sdl /Od /Oy- /D WIN32 /D _DEBUG ...

  2. BeanstalkClient学习

    针对BeanstalkClient-1.4.6.jar 生产者 示例代码: package com.lky.test; import java.io.UnsupportedEncodingExcept ...

  3. NSDateFormatter整理

    dd/MM/yyyy hh:mmaaa                          10/05/2010 03:49PM yyyy:MM:dd G 'at' HH:mm:ss zzz       ...

  4. swift菜鸟入门视频教程-04-集合类型

    本人自己录制的swift菜鸟入门,欢迎大家拍砖,有什么问题能够在这里留言. 主要内容: 数组(Arrays) 字典(Dictionaries) 集合的可变性(Mutability of Collect ...

  5. (各个公司面试原题)在线做了一套CC++综合測试题,也来測一下你的水平吧(二)

    刚才把最后的10道题又看了下.也发上来吧. 以下给出试题.和我对题目的一些理解 前10道题地址 (各个公司面试原题)在线做了一套CC++综合測试题.也来測一下你的水平吧(一) 11.设已经有A,B,C ...

  6. python课程第一天作业1-模拟登录

    第一周作业: 作业1:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 流程图: 代码:后来修改过一次: #!/usr/bin/env python # -*-conding:ut ...

  7. jquery之多重判断

    var appPath = getAppPath(); $(function(){ $('#addTeskDlg').window('close'); teskGrid(); }); function ...

  8. (转)jQuery Validation Plugin客户端表单证验插件

    jQuery Validation Plugin客户端表单验证插件 官方文档:http://jqueryvalidation.org/documentation/ 官方demo:http://jque ...

  9. UIViewController的生命周期(图解)

    当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序1. alloc                             创建对象,分配空间2.init (initWithNibName ...

  10. .NET MVC通过反射获取数据修改历史记录,并插入数据表中

    本文属于原创,转载时请标明出处! 折磨了我一个晚上的问题,奈何对物理的反射印象太深了,整天去想着物理的反射.折射怎么解.感谢少将哥哥给我的指点,经过一个晚上对反射的恶补,最终搞定了.纪念一下. 1.核 ...