[HAOI2007,P2216,BZOJ1047]理想的正方形单调队列解法
题目描述
有一个 \(a \times b\) 的整数组成的矩阵,现请你从中找出一个 \(n \times n\) 的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
输入格式
第一行为 \(3\) 个整数,分别表示 \(a,b,n\) 的值。
第二行至第 \(a+1\) 行每行为 \(b\) 个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
输出格式
仅一个整数,为 \(a \times b\) 矩阵中所有“ \(n \times 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,000,000,000\)。
\(20\%\) 的数据 \(2 \le a,b \le 100,n \le a,n \le b,n \le 10\)。
\(100\%\) 的数据 \(2 \le a,b \le 1000,n \le a,n \le b,n \le 100\)。
代码展示
一看就是单调队列
#include <iostream>
#include <deque>
using namespace std;
const int N = 1024;
int G[N][N];
deque<pair<int, int>> _maxn;
deque<pair<int, int>> _minn;
int maxn[N][N];
int minn[N][N];
int maxn2[N][N];
int minn2[N][N];
int ans_max[N][N];
int ans_min[N][N];
int main()
{
int a, b, n;
cin >> a >> b >> n;
for (int i = 1; i <= a; i++)
{
for (int j = 1; j <= b; j++)
{
cin >> G[i][j];
}
}
for (int i = 1; i <= a; i++)
{
for (int j = 1; j <= b; j++)
{
while (!_maxn.empty() && _maxn.front().second <= j - n)
_maxn.pop_front();
while (!_minn.empty() && _minn.front().second <= j - n)
_minn.pop_front();
while (!_maxn.empty() && _maxn.back().first < G[i][j])
_maxn.pop_back();
while (!_minn.empty() && _minn.back().first > G[i][j])
_minn.pop_back();
_maxn.push_back(make_pair(G[i][j], j));
_minn.push_back(make_pair(G[i][j], j));
if (j >= n)
{
maxn[i][j] = _maxn.front().first;
minn[i][j] = _minn.front().first;
}
}
_maxn.clear();
_minn.clear();
}
for (int i = n; i <= b; i++)
{
for (int j = 1; j <= a; j++)
{
while (!_maxn.empty() && _maxn.front().second <= j - n)
_maxn.pop_front();
while (!_minn.empty() && _minn.front().second <= j - n)
_minn.pop_front();
while (!_maxn.empty() && _maxn.back().first < maxn[j][i])
_maxn.pop_back();
while (!_minn.empty() && _minn.back().first > minn[j][i])
_minn.pop_back();
_maxn.push_back(make_pair(maxn[j][i], j));
_minn.push_back(make_pair(minn[j][i], j));
if (j >= n)
{
ans_max[j][i] = _maxn.front().first;
ans_min[j][i] = _minn.front().first;
}
}
_maxn.clear();
_minn.clear();
}
int ans = 0x3f3f3f3f;
for (int i = n; i <= a; i++)
for (int j = n; j <= b; j++)
ans = min(ans, ans_max[i][j] - ans_min[i][j]);
cout << ans;
return 0;
}
[HAOI2007,P2216,BZOJ1047]理想的正方形单调队列解法的更多相关文章
- P2216 [HAOI2007]理想的正方形 (单调队列)
题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP
洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...
- bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp
题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2369 Solved: 1266[Submi ...
- BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )
单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...
- bzoj1047/luogu2216 理想的正方形 (单调队列)
开b组单调队列,分别维护此时某一列中的最大/最小值 然后我每次把它们的头取出来,塞到维护行的单调队列里,就是n*n的最大/最小值 #include<bits/stdc++.h> #defi ...
- Luogu 2216[HAOI2007]理想的正方形 - 单调队列
Solution 二维单调队列, 这个数组套起来看得我眼瞎... Code #include<cstdio> #include<algorithm> #include<c ...
- BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞
题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...
- [HAOI2007] 理想的正方形 (单调队列)
题目链接 Solution MD,经过这道题,算是掌握单调队列了... 可以先预处理出点 \((i,j)\) 往上 \(n\) 的最大值和最小值. 然后再横着做一遍单调队列即可. Code #incl ...
- BZOJ 1047 理想的正方形(单调队列)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思 ...
随机推荐
- jvm调优监控工具jps、jstack、jmap、jhat、jstat使用详解
目录 前言 jps(Java Virtual Machine Process Status Tool) jstack jmap(Memory Map)和jhat(Java Heap Analysis ...
- DataGear 自定义数据可视化看板的图表主题
DataGear 看板的 dg-chart-theme 属性,提供了简单且强大的自定义图表主题功能. 通常,只需要设置其color.backgroundColor.actualBackgroundCo ...
- 【Azure App Service for Linux】Linux Web App如何安装系统未安装的包
问题描述 Linux Web App中如何安装系统默认未安装的包,如何来执行如 apt install XXX命令呢?现在遇见的问题时,通过Azure App Service门户中的SSH登录后,执行 ...
- YAML 语法简介与 C# 操作示例
〇.简介 YAML(Yet Another Markup Language)另一种标记语言. YAML 是一种较为人性化的数据序列化语言,可以配合目前大多数编程语言使用.YAML 的语法比较简洁直观, ...
- netcat 命令介绍及使用示例
netcat 命令介绍及使用示例 nc(netcat)是一个强大的网络工具,它可以用于读取和写入数据流,支持 TCP 和 UDP 协议.它常被用于网络调试和网络服务的创建. 一.安装方法 centos ...
- 【拉格朗日优化dp】P4365 [九省联考 2018] 秘密袭击 coat
[拉格朗日优化dp]P4365 [九省联考 2018] 秘密袭击 coat 题目简述 求树上所有连通块第 \(k\) 大点权(不足 \(k\) 点记为 \(0\))的和. \(1\leq k\leq ...
- LLM 推理和应用 开源框架梳理
之前对LLM 推理和应用了解不多,因此抽时间梳理了一下,我们从模型量化,模型推理,以及开发平台等三个层面来梳理分析. 模型量化 模型训练时为了进度,采用的32位浮点数,因此占用的空间较大,一些大的模型 ...
- gcc编译stm32 f103出现错误init.c:(.text.__libc_init_array+0x20): undefined reference to `_init'
解决方法: 方法一:去掉makefile中的编译选项:-nostartfiles 方法二:方法一不凑效的情况下,添加编译选型:--specs=nano.specs
- docker跑es流程再整理
参考,欢迎点击原文:https://blog.csdn.net/qq_32101993/article/details/100021002(报错) 继老早前一篇文章整理的使用docker-compos ...
- GDB调试之多线程
1.set scheduler-locking off/on/step 调试时除了当前线程在运行,要想规定其他线程的运行情况用这个命令,有三个选择: set scheduler-locking off ...