#include<bits/stdc++.h>

using namespace std;

const int A=;
const int N=;
int a,b,n;
int g[A][A],q[A][N],Q[A][N];
int head[A],tail[A];
int Head[A],Tail[A]; inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;} int main(){
a=read(),b=read(),n=read();
for(register int i=;i<=a;i++)
for(register int j=;j<=b;j++) g[i][j]=read(); for(register int j=;j<=b;j++){
head[j]=tail[j]=;
Head[j]=Tail[j]=;
for(register int i=;i<=n-;i++){
while(head[j]<=tail[j]&&g[i][j]<=g[q[j][tail[j]]][j]) tail[j]--;
q[j][++tail[j]]=i;
while(Head[j]<=Tail[j]&&g[i][j]>=g[Q[j][Tail[j]]][j]) Tail[j]--;
Q[j][++Tail[j]]=i;
}
}
int ans=0x3f3f3f3f;
for(register int i=n;i<=a;i++){
for(register int j=;j<=b;j++){
while(head[j]<=tail[j]&&q[j][head[j]]<i-n+) head[j]++;
while(head[j]<=tail[j]&&g[i][j]<=g[q[j][tail[j]]][j]) tail[j]--;
q[j][++tail[j]]=i; while(Head[j]<=Tail[j]&&Q[j][Head[j]]<i-n+) Head[j]++;
while(Head[j]<=Tail[j]&&g[i][j]>=g[Q[j][Tail[j]]][j]) Tail[j]--;
Q[j][++Tail[j]]=i;
}
for(register int j=n;j<=b;j++){
int mi=0x3f3f3f3f,mx=-0x3f3f3f3f;
for(register int k=j-n+;k<=j;k++){
mi=min(mi,g[q[k][head[k]]][k]);
mx=max(mx,g[Q[k][Head[k]]][k]);
}
ans=min(ans,mx-mi);
}
}
printf("%d\n",ans);return ;
}

二维单调队列

luogu 2216 理想的正方形 单调队列(其实没有DP)的更多相关文章

  1. Luogu 2216[HAOI2007]理想的正方形 - 单调队列

    Solution 二维单调队列, 这个数组套起来看得我眼瞎... Code #include<cstdio> #include<algorithm> #include<c ...

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

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

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

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

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

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

  5. P2216 [HAOI2007]理想的正方形 (单调队列)

    题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...

  6. BZOJ 1047 理想的正方形(单调队列)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思 ...

  7. bzoj1047/luogu2216 理想的正方形 (单调队列)

    开b组单调队列,分别维护此时某一列中的最大/最小值 然后我每次把它们的头取出来,塞到维护行的单调队列里,就是n*n的最大/最小值 #include<bits/stdc++.h> #defi ...

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

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

  9. [HAOI2007] 理想的正方形 (单调队列)

    题目链接 Solution MD,经过这道题,算是掌握单调队列了... 可以先预处理出点 \((i,j)\) 往上 \(n\) 的最大值和最小值. 然后再横着做一遍单调队列即可. Code #incl ...

随机推荐

  1. luogu4093 序列 (cdq分治优化dp)

    设f[i]是以i位置为结尾的最长满足条件子序列的长度 那么j能转移到i的条件是,$j<i , max[j]<=a[i] , a[j]<=min[i]$,其中max和min表示这个位置 ...

  2. HDU5985 Lucky Coins 概率dp

    题意:给你N种硬币,每种硬币有Si个,有Pi 概率朝上,每次抛所有硬币抛起,所有反面的拿掉,问每种硬币成为最后的lucky硬币的概率. 题解:都知道是概率dp,但是模拟赛时思路非常模糊,很纠结,dp[ ...

  3. poj 1144 (Tarjan求割点数量)

    题目链接:http://poj.org/problem?id=1144 描述 一个电话线公司(简称TLC)正在建立一个新的电话线缆网络.他们连接了若干个地点分别从1到N编号.没有两个地点有相同的号码. ...

  4. BZOJ 1054: [HAOI2008]移动玩具(bfs)

    题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1054 题解: 将每一种状态十六位压成二进制,然后bfs..不解释.. p.s.注意特判初始 ...

  5. 我眼中的 Docker(二)Image

    Docker 安装 如何安装 docker 详见官网: installation 或者 中文指南. 不过 linux 上我推荐用 curl 安装,因为 apt-get 中源要么没有 docker,要么 ...

  6. 真机控件获取 app-inspector

    1.安装app-inspector:npm  install  app-inspector  -g 若是要卸载原有的:npm   uninstall   app-inspector   -g   np ...

  7. tomcat发布项目,运行不了

    工作中经常出现项目本来运行得好好的,从SVN上面更新代码后就不行了 这个问题有时候是因为编译不成功,处理步骤如下: 1.clean整个项目,重新编译 2.如果还是不行,则把编译中认为是error的设置 ...

  8. JS with

    <script type="text/javascript"> function Dog(){ this.type="dog"; this.tail ...

  9. 高级组件——表格JTable

    JTable(Object[][] rowData,Object[] columnNames)                         表格数据              列名集合 setSe ...

  10. php小项目踩坑以及其中的注意点(第二篇)

    用户登录页面 1.通过数据库验证用户名和密码(可以将里面要用到的数据库信息,放入到一个config文件中) <?php define('DB_HOST','localhost'); define ...