先把整个矩阵处理成b[n][m-K+1]、c[n][m-K+1]大小的两个矩阵,分别存储每行每K个数中的最大、最小值,然后再通过b、c处理出d、e分别表示K*K大小的子矩阵中的最大、最小值即可。单调队列暴力。

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 1001
int n,m,K,a[N][N],b[N][N],c[N][N],q[N],head,tail,d[N][N],e[N][N];
int ans=2147483647;
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;++i)
{
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(a[i][j]<=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
}
b[i][1]=a[i][q[head]];
for(int j=K+1;j<=m;++j)
{
if(q[head]<j-K+1) ++head;
while(a[i][j]<=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
b[i][j-K+1]=a[i][q[head]];
}
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(a[i][j]>=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
}
c[i][1]=a[i][q[head]];
for(int j=K+1;j<=m;++j)
{
if(q[head]<j-K+1) ++head;
while(a[i][j]>=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
c[i][j-K+1]=a[i][q[head]];
}
}
for(int i=1;i<=m-K+1;++i)
{
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(b[j][i]<=b[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
}
d[1][i]=b[q[head]][i];
for(int j=K+1;j<=n;++j)
{
if(q[head]<j-K+1) ++head;
while(b[j][i]<=b[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
d[j-K+1][i]=b[q[head]][i];
}
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(c[j][i]>=c[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
}
e[1][i]=c[q[head]][i];
for(int j=K+1;j<=n;++j)
{
if(q[head]<j-K+1) ++head;
while(c[j][i]>=c[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
e[j-K+1][i]=c[q[head]][i];
}
}
for(int i=1;i<=n-K+1;++i)
for(int j=1;j<=m-K+1;++j)
ans=min(ans,e[i][j]-d[i][j]);
printf("%d\n",ans);
return 0;
}

【单调队列】bzoj1047 [HAOI2007]理想的正方形的更多相关文章

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

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  2. bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形

    http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...

  3. [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列

    理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...

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

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

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

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

  6. [题解](单调队列)luogu_P2216_BZOJ_1047 理想的正方形

    调了半天,发现这个写法确实极易错...... 对于每列都维护一个单调队列记录最大最小值,这样一次操作后就把最大最小值压到了一维, 然后再对这一行维护一个单调队列,每次更新ans值,然而对于数组和队列下 ...

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

    传送门 蛤省省选果然水啊,我这种蒟蒻都能一遍A. 横向纵向维护两个单调队列,做两次求最大和最小的,总复杂度$O(NM)$ 码农题,考察代码实现能力 //BZOJ 1047 //by Cydiater ...

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

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

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

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

随机推荐

  1. 从零开始学习MXnet(三)之Model和Module

    在我们在MXnet中定义好symbol.写好dataiter并且准备好data之后,就可以开开心的去训练了.一般训练一个网络有两种常用的策略,基于model的和基于module的.今天,我想谈一谈他们 ...

  2. mysql删除id最小的条目

    DELETE FROM 表1 WHERE Mid in (select Mid from (SELECT Min(Mid) Mid FROM 表1 c1) t1);

  3. ansible 批量修改root密码

    [root@sz_fy_virt_encrypt_33_239 fetch]# cat /opt/passwd.yml - hosts: web vars: path: /home/opsadmin ...

  4. Document base D:\devTools\apache-tomcat-6.0.51\webapps\AppService does not exist or is not a readable directory

    tomcat通过eclipse发布项目到webapp后  手动删除在webapp目录下的文件,启动tomcat时,会报出异常找不到那个删除的项目. 解决方法是(1)重新发布项目到webapp (2)在 ...

  5. jquery从零起步学

    html: <HTML> <head> <meta http-equiv="content-type" content="text/html ...

  6. java实现ssm框架的crud

    上一篇博客写了通过表名获取数据库表结构的demo,现在我以此为基础实现了一个简单的通过数据库表结构生成对应的实体,通过读取mapper接口文件.mapping映射文件. service映射文件模板,替 ...

  7. [05]Git查看、删除、重命名远程分支和tag

    Git查看.删除.重命名远程分支和tag 2015-06-15:加入姊妹篇: 2013-11-06:加入重命名远程分支的内容: 2013-01-09:加入删除远程tag的内容. 姊妹篇:使用Git.G ...

  8. Python基础(6)_函数

    一 为何要有函数? 不加区分地将所有功能的代码垒到一起,问题是: 代码可读性差 代码冗余 代码可扩展差 如何解决? 函数即工具,事先准备工具的过程是定义函数,拿来就用指的就是函数调用 结论:函数使用必 ...

  9. hive的体系架构及安装

    1,什么是Hive? Hive是能够用类SQL的方式操作HDFS里面数据一个数据仓库的框架,这个类SQL我们称之为HQL(Hive Query Language) 2,什么是数据仓库? 存放数据的地方 ...

  10. POJ1286 Necklace of Beads

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8263   Accepted: 3452 Description Beads ...