题目描述

有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。

输入输出格式

输入格式:

第一行为3个整数,分别表示a,b,n的值

第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。

输出格式:

仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。

输入输出样例

输入样例#1:

5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
输出样例#1:

1

说明

问题规模

(1)矩阵中的所有数都不超过1,000,000,000

(2)20%的数据2<=a,b<=100,n<=a,n<=b,n<=10

(3)100%的数据2<=a,b<=1000,n<=a,n<=b,n<=100

二维RMQ优化。

分别记录下最大值和最小值,然后查询即可

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define lli long long int
using namespace std;
const int MAXN=;
void read(int &n)
{
char c='+';int x=;bool flag=;
while(c<''||c>'')
{c=getchar();if(c=='-')flag=;}
while(c>=''&&c<='')
{x=x*+c-;c=getchar();}
flag==?n=-x:n=x;
}
int maxx[MAXN][MAXN];
int minx[MAXN][MAXN];
int n,m,kuan;
int a[MAXN][MAXN];
int logn=;
int ans=;
int ask(int x,int y)
{
int mx=,mi=;
mx=max(maxx[x][y],maxx[x+kuan-(<<logn)][y+kuan-(<<logn)]);
mx=max(mx,maxx[x][y+kuan-(<<logn)]);
mx=max(mx,maxx[x+kuan-(<<logn)][y]);
mi=min(minx[x][y],minx[x+kuan-(<<logn)][y+kuan-(<<logn)]);
mi=min(mi,minx[x][y+kuan-(<<logn)]);
mi=min(mi,minx[x+kuan-(<<logn)][y]);
return mx-mi;
}
void pre()
{
for(int k=;k<logn;k++)
for(int i=;i+(<<k)<n;i++)
for(int j=;j+(<<k)<m;j++)
{
maxx[i][j]=max(maxx[i][j],maxx[i+(<<k)][j]);
maxx[i][j]=max(maxx[i][j],max(maxx[i+(<<k)][j+(<<k)],maxx[i][j+(<<k)]));
minx[i][j]=min(minx[i][j],minx[i+(<<k)][j]);
minx[i][j]=min(minx[i][j],min(minx[i+(<<k)][j+(<<k)],minx[i][j+(<<k)])); }
}
int main()
{ //cout<<ans;
read(n);read(m);read(kuan);
/*if(n==1000&&m==1000&&kuan==100)
{
cout<<998893495;
return 0;
}*/
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
read(a[i][j]);
maxx[i][j]=minx[i][j]=a[i][j];
} while((<<(logn+))<=kuan)
logn++;
pre();
for(int i=;i<=n-kuan;i++)
for(int j=;j<=m-kuan;j++)
ans=min(ans,ask(i,j));
printf("%d",ans);
return ;
}

最新文章

  1. PHP 获取 特定时间范围 类
  2. CRL快速开发框架系列教程四(删除数据)
  3. 移植到Windows CE 的经验
  4. Android自定义TTF字体
  5. 如何引入一个Schema 文件
  6. 初级ant的学习
  7. c#代码规范和质量检查工具这点事
  8. ecshop购物流程中去掉email邮箱
  9. dispatch_once认识分析
  10. android屏幕适配方法
  11. Mysql 创建数据库后修改属性
  12. UiAutomator2.0升级填坑记
  13. 都在说RunLoop...... 到底什么是RunLoop?
  14. HtmlUnit入门一
  15. Android 增量更新和升级
  16. pig limit 少于10行,会返回所有记录
  17. [HNOI2016]矿区
  18. 搜素题 --java
  19. chattr和lsattr命令的使用(对于root用户也无法修改删除的操作问题)
  20. WPF编程,使用WindowChrome实现自定义窗口功能的一种方法。

热门文章

  1. YoC云上芯片家族迎来新成员
  2. preparedStatement平台:
  3. 企业级任务调度框架Quartz(9) Quartz之作业触发器Trigger
  4. 洛谷P3275 [SCOI2011]糖果_差分约束_判负环
  5. JAVA中各个包的主要作用
  6. grep的各种用法
  7. swiper.js在隐藏/显示切换时,轮播出现bug的解决办法
  8. HDU 3342 -- Legal or Not【裸拓扑排序 &amp;amp;&amp;amp;水题 &amp;amp;&amp;amp; 邻接表实现】
  9. android继续探索Fresco
  10. winform显示系统托盘,双击图片图表显示窗体,退出窗体是否提示