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

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 1001
int n,m,K,a[N][N],b[N][N],c[N][N],q[N],head,tail,d[N][N],e[N][N];
int ans=2147483647;
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;++i)
{
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(a[i][j]<=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
}
b[i][1]=a[i][q[head]];
for(int j=K+1;j<=m;++j)
{
if(q[head]<j-K+1) ++head;
while(a[i][j]<=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
b[i][j-K+1]=a[i][q[head]];
}
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(a[i][j]>=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
}
c[i][1]=a[i][q[head]];
for(int j=K+1;j<=m;++j)
{
if(q[head]<j-K+1) ++head;
while(a[i][j]>=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
c[i][j-K+1]=a[i][q[head]];
}
}
for(int i=1;i<=m-K+1;++i)
{
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(b[j][i]<=b[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
}
d[1][i]=b[q[head]][i];
for(int j=K+1;j<=n;++j)
{
if(q[head]<j-K+1) ++head;
while(b[j][i]<=b[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
d[j-K+1][i]=b[q[head]][i];
}
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(c[j][i]>=c[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
}
e[1][i]=c[q[head]][i];
for(int j=K+1;j<=n;++j)
{
if(q[head]<j-K+1) ++head;
while(c[j][i]>=c[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
e[j-K+1][i]=c[q[head]][i];
}
}
for(int i=1;i<=n-K+1;++i)
for(int j=1;j<=m-K+1;++j)
ans=min(ans,e[i][j]-d[i][j]);
printf("%d\n",ans);
return 0;
}

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(43)-工作流设计-字段分类设计
  2. javascript版快速排序和冒泡排序
  3. SDK接入(U8SDK)——SDK抽象层的设计
  4. 创建自己的Activity
  5. Longest Substring with At Most K Distinct Characters
  6. 【shell】sort命令
  7. 浅谈css中的position属性
  8. POJ2689 - Prime Distance(素数筛选)
  9. SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)
  10. 为什么Android AsyncTask的使用要遵循五大原则
  11. java--文件过滤器和简单系统交互
  12. 安装rac遇到的问题总结:
  13. 用DIV+CSS做网页里要设置body和*规定内容
  14. Java基础——深入理解Java中的final关键字(转载)
  15. 一步一步设置Joomla!开发环境
  16. Base64编码的原理
  17. JS之工厂模式
  18. Python判断字符串是否xx开始或结尾
  19. Photoshop 基础三 制作简单按钮
  20. linux下一个监测进程CPU和MEM使用率的shell脚本

热门文章

  1. Reasons to use innodb_file_per_table
  2. [hdu 1067]bfs+hash
  3. linux 监控网卡实时流量iftop
  4. 动态性能视图v$session_longops
  5. Java之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致
  6. 初识 spl_autoload_register
  7. matlab求最大公约数和最小公倍数
  8. JSON.parse() 和 JSON.stringify()使用
  9. CSS3学习之radial-gradient(径向渐变)
  10. AngularJs学习——何时应该使用Directive、Controller、Service?