题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047

我们对每矩阵的一列维护一个大小为$n$的单调队列,队中元素为矩阵中元素。然后扫描每一行,再次维护一个大小为$n$的单调队列,队中元素为当前列的队列中取出的最值。$O(n^2)$扫过去就可以了。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=<<;
int inline readint(){
int Num;char ch;
while((ch=getchar())<''||ch>'');Num=ch-'';
while((ch=getchar())>=''&&ch<='') Num=Num*+ch-'';
return Num;
}
int A,B,N;
int M[][];
int qmn1[][],qmn2[][],hmn[],tmn[];
int qmx1[][],qmx2[][],hmx[],tmx[];
int Qmn1[],Qmn2[],Hmn,Tmn;
int Qmx1[],Qmx2[],Hmx,Tmx;
int main(){
A=readint();
B=readint();
N=readint();
for(int i=;i<=A;i++)
for(int j=;j<=B;j++)
M[i][j]=readint();
for(int i=;i<=B;i++){
hmx[i]=hmn[i]=;
tmx[i]=tmn[i]=;
for(int j=;j<N;j++){
while(hmx[i]<=tmx[i]&&qmx1[i][tmx[i]]<=M[j][i]) tmx[i]--;
qmx1[i][++tmx[i]]=M[j][i];
qmx2[i][tmx[i]]=j;
while(hmn[i]<=tmn[i]&&qmn1[i][tmn[i]]>=M[j][i]) tmn[i]--;
qmn1[i][++tmn[i]]=M[j][i];
qmn2[i][tmn[i]]=j;
}
}
int ans=INF;
for(int i=N;i<=A;i++){
for(int j=;j<=B;j++){
while(hmx[j]<=tmx[j]&&qmx2[j][hmx[j]]+N<=i) hmx[j]++;
while(hmx[j]<=tmx[j]&&qmx1[j][tmx[j]]<=M[i][j]) tmx[j]--;
qmx1[j][++tmx[j]]=M[i][j];
qmx2[j][tmx[j]]=i;
while(hmn[j]<=tmn[j]&&qmn2[j][hmn[j]]+N<=i) hmn[j]++;
while(hmn[j]<=tmn[j]&&qmn1[j][tmn[j]]>=M[i][j]) tmn[j]--;
qmn1[j][++tmn[j]]=M[i][j];
qmn2[j][tmn[j]]=i;
}
Hmx=Hmn=;
Tmx=Tmn=;
for(int j=;j<N;j++){
while(Hmx<=Tmx&&Qmx1[Tmx]<=qmx1[j][hmx[j]]) Tmx--;
Qmx1[++Tmx]=qmx1[j][hmx[j]];
Qmx2[Tmx]=j;
while(Hmn<=Tmn&&Qmn1[Tmn]>=qmn1[j][hmn[j]]) Tmn--;
Qmn1[++Tmn]=qmn1[j][hmn[j]];
Qmn2[Tmn]=j;
}
for(int j=N;j<=B;j++){
while(Hmx<=Tmx&&Qmx2[Hmx]+N<=j) Hmx++;
while(Hmx<=Tmx&&Qmx1[Tmx]<=qmx1[j][hmx[j]]) Tmx--;
Qmx1[++Tmx]=qmx1[j][hmx[j]];
Qmx2[Tmx]=j;
while(Hmn<=Tmn&&Qmn2[Hmn]+N<=j) Hmn++;
while(Hmn<=Tmn&&Qmn1[Tmn]>=qmn1[j][hmn[j]]) Tmn--;
Qmn1[++Tmn]=qmn1[j][hmn[j]];
Qmn2[Tmn]=j;
ans=min(ans,Qmx1[Hmx]-Qmn1[Hmn]);
}
}
printf("%d\n",ans);
return ;
}

最新文章

  1. struts之类型转换
  2. Java 内存管理
  3. xcode8升级后问题总汇
  4. jquery 设置焦点
  5. 30分钟LINQ教程(转)
  6. c 深度剖析 4
  7. C#用DES加密JAVA用DES解密,JAVA用DES加密C#用DES解密的实现
  8. Mozilla研究—深入理解mozilla所需的背景知识
  9. Openstack Ceilometer监控项扩展
  10. Oracle的汉字转拼音首字母的函数
  11. 旧版QT的名称:qt-win-commercial-4.4.3-vc60.exe
  12. python爬虫教程实践1——安装scrapy
  13. 探讨.NET Core数据进行3DES加密和解密问题
  14. vuex mapState、mapGetters、mapActions、mapMutations的使用
  15. 【loj6142】「2017 山东三轮集训 Day6」A 结论题+Lucas定理
  16. [福建集训2011][LOJ10111]相框
  17. FlashFXP+FileZillaServer
  18. mac 安装yarn失败
  19. VNC安装配置
  20. js操作字符串的常用方法

热门文章

  1. 「NOIP2002」「Codevs1099」 字串变换(BFS
  2. C++之log4cpp库的使用
  3. java+poi实现word转html显示
  4. 注册页面Page的内置属性以及函数 路由 模块化
  5. 配置哨兵监控Redis运行情况
  6. 如何使用最简单的方法将一个已经存在的工程中使用 cocaPodfile
  7. WebBrowser内嵌页面的跨域调用问题
  8. Ubuntu解压windows下的.zip文件出现乱码的解决办法
  9. ECharts使用问题
  10. supervisor uwsgi配置文件