【题意】

  • 给定一个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. SQL server 数据库基础语句 子查询 基础函数

    上一章 说了下   子查询的意义是 把一条查询语句当做值来使用 select *from car   //查询汽车的信息 假设我知道一个汽车的编号是 c021 但是我要查询 比这个汽车价格高的汽车信息 ...

  2. strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用

    strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *stringA; @property ...

  3. iterator与iterable

    用Iterator模式实现遍历集合Iterator模式是用于遍历集合类的标准访问方法.它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构.例如,如果没有使用Iterato ...

  4. ios 使用NSRegularExpression解析正则表达式

    初始化一个   NSRegularExpression 对象 注:_str是要匹配的字符串 NSRegularExpression *regex = [NSRegularExpression regu ...

  5. 兼容IE6\7\8浏览器的html5标签的几个方案

    html5大行其道的时代已经到来.如果你还在等待浏览器兼容,说明你已经与web脱节几条街了.当然,这得益于移动客户端的蓬勃发展.如果还在纠结于,是否应该掌握html5和css3技术时,请狠狠的抽自己几 ...

  6. 移动端:active伪类无效的解决方法

    :active伪类常用于设定点击状态下或其他被激活状态下一个链接的样式.最常用于锚点<a href="#">这种情况,一般主流浏览器下也支持其他元素,如button等. ...

  7. Hibernate查询语句HQL8大特点

    Hibernate拥有一种功能非常强大的查询语言,这种语言被有意得与SQL非常相似,便于开发人员掌握.但不要被HQL的语法表面所迷惑,HQL完全是面向对象的,可以用来过程多态.继承.关联等关系. 1. ...

  8. 原 荐 使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控

    原 荐 使用Spring Boot Actuator.Jolokia和[可视化]Grafana实现准实时监控.   监控系统:          日志- 基础处理 - 表格 - 可视化一体化解决方案. ...

  9. shell脚本,锁机制

    [root@localhost wyb]# cat suijizhi.sh #!/bin/bash a=`|grep -v grep |wc -l` echo "$a" [ $a ...

  10. Sass基本数据类型和各类型的原生方法

    数据类型: 数字:1,2,3,11,10px (可以带单位) 字符串:"asd",'asd',asd (有引号和无引号都是字符串类型) 如 $name : zhang san ; ...