题目描述

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

输入

第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
100%的数据2<=a,b<=1000,n<=a,n<=b,n<=1000

输出

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

样例输入

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

样例输出

1


题解

二维RMQ

说RMQ过不去的站出来。。。我打肿他的脸。。。

由于查询区域是个正方形,因此我们不用对两维分别倍增,而是一起倍增,令$mx/mn[i][j][k]$表示从$(i,j)$向右下的$2^k*2^k$的区域内的最大/最小值。

预处理方法与一维RMQ一样,只不过变成4个更新1个。。。

然后就没有然后了。。。

时间复杂度$O(ab\log n)$。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1010
using namespace std;
int v[N][N] , mx[11][N][N] , mn[11][N][N] , k;
int main()
{
int a , b , n , i , j , ans = 1 << 30 , maxn , minn;
scanf("%d%d%d" , &a , &b , &n);
for(i = 1 ; i <= a ; i ++ )
for(j = 1 ; j <= b ; j ++ )
scanf("%d" , &v[i][j]) , mx[0][i][j] = mn[0][i][j] = v[i][j];
for(k = 1 ; (1 << k) <= n ; k ++ )
for(i = 1 ; i <= a - (1 << k) + 1 ; i ++ )
for(j = 1 ; j <= b - (1 << k) + 1 ; j ++ )
mx[k][i][j] = max(max(mx[k - 1][i][j] , mx[k - 1][i][j + (1 << (k - 1))]) , max(mx[k - 1][i + (1 << (k - 1))][j] , mx[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]))
, mn[k][i][j] = min(min(mn[k - 1][i][j] , mn[k - 1][i][j + (1 << (k - 1))]) , min(mn[k - 1][i + (1 << (k - 1))][j] , mn[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]));
k -- ;
for(i = 1 ; i <= a - n + 1 ; i ++ )
for(j = 1 ; j <= b - n + 1 ; j ++ )
maxn = max(max(mx[k][i][j] , mx[k][i][j + n - (1 << k)]) , max(mx[k][i + n - (1 << k)][j] , mx[k][i + n - (1 << k)][j + n - (1 << k)]))
, minn = min(min(mn[k][i][j] , mn[k][i][j + n - (1 << k)]) , min(mn[k][i + n - (1 << k)][j] , mn[k][i + n - (1 << k)][j + n - (1 << k)]))
, ans = min(ans , maxn - minn);
printf("%d\n" , ans);
return 0;
}

【bzoj1047】[HAOI2007]理想的正方形 二维RMQ的更多相关文章

  1. BZOJ1047[HAOI2007]理想的正方形——二维ST表

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...

  2. 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列

    题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...

  3. [BZOJ1047][HAOI2007]理想的正方形 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 我们对每矩阵的一列维护一个大小为$n$的单调队列,队中元素为矩阵中元素.然后扫描每一 ...

  4. bzoj1047 [HAOI2007]理想的正方形——二维单调队列

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 就是先对行做一遍单调队列,再对那个结果按列做一遍单调队列即可. 代码如下: #incl ...

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

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

  6. bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形

    http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...

  7. [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列

    理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...

  8. [Bzoj1047][HAOI2007]理想的正方形(ST表)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 题目虽然有一个n的限制,但求二维区间最值首先想到的还是RMQ,但是如果按照往常RM ...

  9. [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)

    题意 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 思路 RMQ求 再DP 代码 #include<cstdio> #i ...

随机推荐

  1. Java框架 面试题总结

    一. Struts1.x 4 1. struts1优缺点,为什么要使用struts1 4 2. Struts1核心组件 4 3. Strust1请求处理流程  工作原理 4 4. Struts1线程安 ...

  2. git 删除本地存在,远程已经删除的分支

    git remote prune origin 强迫症,看到这些分支不一致就来气!

  3. jquery 操作DOM元素(1)

    .clone() 创建一个匹配的元素集合的深度拷贝. .clone([withDataAndEvents]) withDataAndEvents (默认为false) 一个Boolean 表示是否会复 ...

  4. MySql错误1045 Access denied for user 'root'@'localhost' (using password:YES)

    1.先停止mysql服务 2.进入mysql的安装路径,找到并打开my.ini文件,找到[mysqld],在该行下面添加 skip_grant_tables,也就是通知mysql,在登陆的时候跳过密码 ...

  5. python scrapy 实战简书网站保存数据到mysql

    1:创建项目 2:创建爬虫 3:编写start.py文件用于运行爬虫程序 # -*- coding:utf-8 -*- #作者: baikai #创建时间: 2018/12/14 14:09 #文件: ...

  6. linux无名管道

    特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程.兄弟进程.子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 ...

  7. Pandas 索引和切片

    Series和Datafram索引的原理一样,我们以Dataframe的索引为主来学习 列索引:df['列名'] (Series不存在列索引) 行索引:df.loc[].df.iloc[] 选择列 / ...

  8. 笔记-python-语法-super

    笔记-python-语法-super 1.      super 1.1.    super起源 首先要理解类的继承和多继承,子类有时需要调用父类的方法, 非绑定方法: class C(B): def ...

  9. 4 Django简介

    MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...

  10. python datetime offset-aware与offset-navie相互转换

    python datetime offset-aware与offset-navie相互转换 2016年11月13日 16:20:43 阅读数:2393 有时,我们使用python 的datetime模 ...