博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HAOI2007]理想的正方形 解题报告
阅读量:4047 次
发布时间:2019-05-25

本文共 1889 字,大约阅读时间需要 6 分钟。

[HAOI2007]理想的正方形 解题报告

题目描述

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

输入输出格式

输入格式:

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

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

输出格式:

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

input

5 4 2

1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2

output

1

思路:

这个题有一种很妙的处理方法。

先上代码:

for (int k = 2; k <= K; k++)        for (int i = 0; i+1 < a; i++)            for (int j = 0; j+1 < b; j++) {
maxv[i][j] = max(grid[i][j], max(maxv[i+1][j+1], max(maxv[i+1][j], maxv[i][j+1]))); minv[i][j] = min(grid[i][j], min(minv[i+1][j+1], min(minv[i+1][j], minv[i][j+1]))); } int ans = INF; for (int i = 0; i <= a-n; i++) for (int j = 0; j <= b-n; j++) ans = min(ans, maxv[i][j]-minv[i][j]);

maxv,minv分别代表这个以i,j为左上角的长度为k的矩阵中最大于最小值分别是多少,grid代表这个数是多少,而循环最外面的k就是非常关键的一步啦。

每次循环可以将k的范围增加1.可以发现,每次k增大的时候,都会与k-1的值有关,所以k要放外面。这样处理,刚好可以将每个子矩阵的最大与最小值求出来。这是一种很妙的处理方法。至少在矩阵中。。

然而这样会T飞!!!

冷静分析一波

会发现,这样的复杂度太高了。而我们的目的是求矩阵的最大值和最小值,所以可以用一波ST表的思想
设MIn[i][j][k],Max[i][j][k]代表以I,j为左上角,大小为2k的矩阵中的最小值与最大值。

while((1<<(t+1) <=k)) t++;//求出2的k次方的指数界限for(int k=0;k < t;k++)        for(int i=0;i+(1<
< m;j++) {
Max[i][j] = max(Max[i][j],max(Max[i+(1<
<

查询有点妙

inline int query(int x,int y){
int nmin=INF,nmax=-INF; nmax=max(Max[x][y],max(Max[k+x-(1<
<

因为(1<<t) <= 2k

所以x-(1<<t)+k是为了保证查询范围可以被完全覆盖。
可以自己举一个K为奇数的例子模拟一下

完整代码

#include
using namespace std;#define maxn 1005#define maxm 10005#define INF 1000000005int n,m,k,t;int a[maxn][maxn],Min[maxn][maxn],Max[maxn][maxn];int ans;inline int query(int x,int y){
int nmin=INF,nmax=-INF; nmax=max(Max[x][y],max(Max[k+x-(1<
<
< t;k++) for(int i=0;i+(1<
< m;j++) {
Max[i][j] = max(Max[i][j],max(Max[i+(1<
<

转载地址:http://zyuci.baihongyu.com/

你可能感兴趣的文章
一篇文章搞懂 Hive 的调优思路
查看>>
HBase是什么?有什么特点?
查看>>
HBase 和 RDBMS 相比有什么区别?
查看>>
一篇文章搞懂 HBase 的整体架构
查看>>
HBase 表的数据模型是什么?
查看>>
3 张图搞懂 HBase 的存储原理.md
查看>>
一篇文章搞懂 HBase 的 flush 机制和 compact 机制
查看>>
一篇文章搞懂 HBase 的 region 拆分机制
查看>>
HBase 表的预分区是什么?为什么要预分区?如何预分区?
查看>>
Flume 是什么?Flume 有什么特点?
查看>>
一篇文章搞懂 Flume 的架构设计
查看>>
Flume 是怎么保障可靠性的?
查看>>
Flume 怎样实现数据的断点续传?
查看>>
Flume 如何自定义 Mysql Source?
查看>>
Flume 如何自定义 Mysql Sink?
查看>>
Flume 的可靠性级别有哪些?
查看>>
Sqoop 是什么?Sqoop 有什么特点?
查看>>
Sqoop 的使用场景分析
查看>>
DAGScheduler 是什么?有什么作用?
查看>>
DAGScheduler 是如何划分 Stage 的?
查看>>