【bzoj1047】[HAOI2007]理想的正方形 二维RMQ
题目描述
有一个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的更多相关文章
- BZOJ1047[HAOI2007]理想的正方形——二维ST表
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
- 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列
题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...
- [BZOJ1047][HAOI2007]理想的正方形 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 我们对每矩阵的一列维护一个大小为$n$的单调队列,队中元素为矩阵中元素.然后扫描每一 ...
- bzoj1047 [HAOI2007]理想的正方形——二维单调队列
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 就是先对行做一遍单调队列,再对那个结果按列做一遍单调队列即可. 代码如下: #incl ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...
- [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列
理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...
- [Bzoj1047][HAOI2007]理想的正方形(ST表)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 题目虽然有一个n的限制,但求二维区间最值首先想到的还是RMQ,但是如果按照往常RM ...
- [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)
题意 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 思路 RMQ求 再DP 代码 #include<cstdio> #i ...
随机推荐
- C编程经验总结
Turbo c Return (z);=return z; 图形界面的有scanf(“%d ~%d\n”,&~,&~);注意:中间不能有乱的东西 Printf(“~~~ %d~~%d\ ...
- 【赛时总结】 ◇赛时·I◇ AtCoder ARC-098
◆赛时I◆ ARC-098 ■试题&解析■ ◆本场最水◆ C-Attention 长点儿信心吧-- [AtCoder ARC-098 C] [解析] 既然只存在左右(东西)两个朝向,那么领导右 ...
- cordforce Educational Codeforces Round 47 补题笔记 <未完>
题目链接 http://codeforces.com/contest/1009 A. Game Shopping 直接模拟即可,用了一个队列来存储账单 #include <iostream> ...
- python基础回顾笔记
1.知道了什么是编程语言 2.知道了python.C#.Java都是语言的种类 3.python:有很多种 cpython.pypy.jpython... 4.python的执行方式有两种: 解释器 ...
- JAVA实现RSA加密,非对称加密算法
RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.K ...
- thinkphp5 获取器的
获取器的作用是在获取数据的字段值后自动进行处理,例如,我们需要对状态值进行转换,可以使用: 1.数据库字段转换. class User extends Model { public function ...
- ethereum(以太坊)(十一)--字节数组(二)
pragma solidity ^0.4.0; contract test { uint [5] T =[1,2,3,4,5] ;//固定长度的数组:可修改数组内值大小,不支持push,不可更改长度 ...
- 【Effective C++ 读书笔记】条款03: 尽量使用 const
关键字const多才多艺,变化多端却不高深莫测. const 修饰指针 面对指针, 你可以指出 指针自身.指针所指物.或者两者都不是 const. 如果关键字 const 出现在星号左边,表示被指物是 ...
- 多线程之ReadWriteLock模拟缓存(九)
错误案例1: package com.net.thread.lock; import java.util.HashMap; import java.util.Map; import java.util ...
- 关于ZYNQ-700是否支持大容量SD卡汇报
关于ZYNQ-700是否支持大容量SD卡 不支持. 下午问了客服的FAE给的答案是不清楚,我自己调研了一下为什么. 调查结果: 1. 大容量的SD卡为什么不支持? SD2.0规范中(SDHC)硬件支持 ...