【题意】

  • 给定一个n*m的矩阵,求所有大小为k*k的正方形中(最大值-最小值)的最小值

【思路】

  • 先横着算出每一行的长度为k的窗口内的最大值,变成一个n*(m-k+1)的矩阵mx
  • 再竖着算出每一列的长度为k的窗口内的最大值,变成一个(n-k+1)*(m-k+1)的矩阵t1(在mx的基础上算)
  • 问题到这里转化为裸的单调队列
  • 最小值同理
  • 时间复杂度为O(n*m)
  • 转自http://www.cnblogs.com/szy-wlxy/p/4631700.html

【AC】

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} int n,m,k;
const int maxn=1e3+;
int a[maxn][maxn];
int mx[maxn][maxn];
int mn[maxn][maxn];
int t1[maxn][maxn];
int t2[maxn][maxn];
struct node
{
int x;
int pos;
node(){}
node(int _x,int _pos):x(_x),pos(_pos){}
}q[maxn];
void pre()
{
for(int i=;i<=n;i++)
{
//max
int head=,tail=;
for(int j=;j<=m;j++)
{
while(tail>=head&&q[tail].x<=a[i][j])
tail--;
q[++tail].x=a[i][j],q[tail].pos=j;
while(q[head].pos<=j-k)
head++;
if(j>=k)
mx[i][j]=q[head].x;
}
//min
head=,tail=;
for(int j=;j<=m;j++)
{
while(tail>=head&&q[tail].x>=a[i][j])
tail--;
q[++tail].x=a[i][j],q[tail].pos=j;
while(q[head].pos<=j-k)
head++;
if(j>=k)
mn[i][j]=q[head].x;
}
}
}
void solve()
{
for(int j=k;j<=m;j++)
{
int head=,tail=;
for(int i=;i<=n;i++)
{
while(tail>=head&&q[tail].x<=mx[i][j])
tail--;
q[++tail].x=mx[i][j],q[tail].pos=i;
while(q[head].pos<=i-k)
head++;
if(i>=k)
t1[i][j]=q[head].x;
}
}
for(int j=k;j<=m;j++)
{
int head=,tail=;
for(int i=;i<=n;i++)
{
while(tail>=head&&q[tail].x>=mn[i][j])
tail--;
q[++tail].x=mn[i][j],q[tail].pos=i;
while(q[head].pos<=i-k)
head++;
if(i>=k)
t2[i][j]=q[head].x;
}
}
int ans;
for(int i=k;i<=n;i++)
{
for(int j=k;j<=m;j++)
{
if(i==k&&j==k) ans=t1[i][j]-t2[i][j];
else ans=min(ans,t1[i][j]-t2[i][j]);
}
}
printf("%d\n",ans);
}
int main()
{
n=read();m=read();k=read();
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
a[i][j]=read();
}
}
pre();
solve();
return ;
}

单调队列

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

  1. 【单调队列】bzoj1047 [HAOI2007]理想的正方形

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

  2. bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp

    题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2369  Solved: 1266[Submi ...

  3. BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )

    单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...

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

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

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

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

  6. bzoj 1047: [HAOI2007]理想的正方形【单调队列】

    没有复杂结构甚至不长但是写起来就很想死的代码类型 原理非常简单,就是用先用单调队列处理出mn1[i][j]表示i行的j到j+k-1列的最小值,mx1[i][j]表示i行的j到j+k-1列的最大值 然后 ...

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

    题目 单调队列是个很神奇的东西,我以前在博客写过(吧) 我很佩服rank里那些排前几的大神,700ms做了时限10s的题,简直不能忍.(但是我还是不会写 我大概一年半没写单调队列,也有可能根本没有写过 ...

  8. 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)

    [BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...

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

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

随机推荐

  1. 面向阿里云专家的 Azure 云服务介绍

    本文是面向阿里云专家的 Azure 云服务介绍,参考本文可以帮助大家“按图索骥”在 Azure 的平台上找到能满足自己需求的服务. 在公有云计算蓬勃发展的同时,中国也出现了越来越多的本土公有云平台.针 ...

  2. 如何找到SAP Cloud for Customer标准培训和认证方面的信息

    有一些朋友询问我如何在SAP官网上找到和SAP Cloud for Customer相关的标准培训信息,我这里把步骤写出来: 登录SAP官网https://training.sap.com 输入和Cl ...

  3. leetcode_1052. Grumpy Bookstore Owner

    1052. Grumpy Bookstore Owner https://leetcode.com/problems/grumpy-bookstore-owner/ 题意:每个时刻i会有custome ...

  4. WPF中单选框RadioButton

    单选框RadioButton的基本使用: <StackPanel Margin="10"> <Label FontWeight="Bold"& ...

  5. div+css实现几种经典布局的详解

    一.左右两侧,左侧固定宽度200px,右侧自适应占满 <div class="divBox"> <div class="left">&l ...

  6. 电商技术中企业数据总线ESB和注册服务管理的区别

    一.概述 1.什么是ESB 就是企业数据总线的意思,他的核心功能就是兼容各种协议接口,可以将数据在各种协议之间进行流转,并且可以针对数据格式进行编排转换. 异构系统,功能繁多,复杂 代表性的项目有:J ...

  7. hihoCoder-1109-堆优化的Prim

    优先队列是由堆组成的,所以当我们使用优先队列对Prim进行优化时,就把这种优化叫做堆优化. 它的算法核心思想就是每次向后找边,每个pair存的都是下一个点,以及边权.我们对于已经走过的点就避开,这样就 ...

  8. 【Python学习之二】装饰器

    装饰器 首先,给出装饰器的框架: def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return ...

  9. 使用Hexo+Github搭建属于自己的博客

    工具:Visual Studio Code/MarkdownPad技术:Hexo+Github 创建Github项目 Github账户注册和新建项目,项目必须要遵守格式:账户名.github.io,不 ...

  10. link与@import导入css样式区别

    XML/HTML代码<link rel="stylesheet" rev="stylesheet" href="CSS文件" type ...