【题意】

  • 给定一个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. C# 分支语句 练习题

    1.“请输入年份:”(1-9999) “请输入月份:”(1-12) “请输入日期:”(要判断大小月,判断闰年) 判断输入的时间日期是否正确 bool dateISOK = false;//放置日期是否 ...

  2. 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest C Sequence (打表)

    打个表找找规律,到24445的时候乘2以后产生了0出现循环. 一般地,判断循环节是否存在可以用Floyd判圈算法. #include<bits/stdc++.h> using namesp ...

  3. UVA10917 A walk trough the Forest (最短路,dp)

    求出家到其他点的最短路径,题目的条件变成了u->v不是回头路等价于d[u]>d[v]. 然后根据这个条件建DAG图,跑dp统计方案数,dp[u] = sum(dp[v]). #includ ...

  4. idea 发布和本地测试问题

    1.maven本地打包成jar 提示[错误: 找不到或无法加载主类]修改 配置maven ---->Runner---->VM Optins [-DarchetypeCatalog=loc ...

  5. Catalan 数

    概要 在一些面试的智力题中会遇到此数的变形,如果完全不了解,直接想结果是很困难的,故在此简单介绍一下.   基本定义 Catalan 数的定义根据不同的应用环境有很多不同的定义方式,下面给出一个.   ...

  6. SniperOJ-leak-x86-64

    参考:1.借助DynELF实现无libc的漏洞利用小结 2.一步一步学ROP之linux_x64篇 - 蒸米 题目源码 #include <stdio.h> #include <un ...

  7. PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)

    PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)  http://www.patest.cn/contests/pat-b-practise/1034 ...

  8. Oracle旗下软件官网下载速度过慢解决办法

    平常下载Oracle旗下软件官网的产品资源,会发现速度很慢,如下载JDK和mysql时, 这样很浪费我们的时间 解决办法: 复制自己需要下载的资源链接 使用迅雷下载该资源 速度均很快 如下载Mysql ...

  9. Bootstrap历练实例:基本按钮群组

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  10. 用vue 简单写的日历

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...