题目描述

有一个 \(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]理想的正方形单调队列解法的更多相关文章

  1. P2216 [HAOI2007]理想的正方形 (单调队列)

    题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...

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

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

  3. 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP

    洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...

  4. bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp

    题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2369  Solved: 1266[Submi ...

  5. BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )

    单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...

  6. bzoj1047/luogu2216 理想的正方形 (单调队列)

    开b组单调队列,分别维护此时某一列中的最大/最小值 然后我每次把它们的头取出来,塞到维护行的单调队列里,就是n*n的最大/最小值 #include<bits/stdc++.h> #defi ...

  7. Luogu 2216[HAOI2007]理想的正方形 - 单调队列

    Solution 二维单调队列, 这个数组套起来看得我眼瞎... Code #include<cstdio> #include<algorithm> #include<c ...

  8. BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞

    题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...

  9. [HAOI2007] 理想的正方形 (单调队列)

    题目链接 Solution MD,经过这道题,算是掌握单调队列了... 可以先预处理出点 \((i,j)\) 往上 \(n\) 的最大值和最小值. 然后再横着做一遍单调队列即可. Code #incl ...

  10. BZOJ 1047 理想的正方形(单调队列)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思 ...

随机推荐

  1. 【Azure API 管理】 为APIM创建一个审批订阅申请的RBAC角色,最少的Action内容是什么呢?

    问题描述 在使用APIM服务中,需要为专门的一组用户赋予特殊的权限:审批APIM用户的对产品的订阅.需要自定义一个RBAC角色,那么如何来设置最少的Action满足需求呢? 问题解答 要对APIM订阅 ...

  2. docker知识整理(备份)

    概念: 镜像:Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板 .镜像是创建 Docker 容器的基础.通过版本管理和增量的文件系统, Docker 提供了一套十分简单的机制来创建和更 ...

  3. 菜单导航tab切换样式的小技巧

    1.最终效果 2.HTML结构 <div class="licaiMenu"> <ul class="navi"> <li> ...

  4. 告别os.path,拥抱pathlib

    pathlib 模块是在Python3.4版本中首次被引入到标准库中的,作为一个可选模块.从Python3.6开始,内置的 open 函数以及 os . shutil 和 os.path 模块中的各种 ...

  5. hutool,真香!

    前言 今天给大家介绍一个能够帮助大家提升开发效率的开源工具包:hutool. Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式 ...

  6. Fiddler 延迟请求

    1.开启浏览器代理 2.fiddler设置要抓取的域名 3.设置fiddler代理端口 Tools->Options->Connections 4.设置接口延时 5.访问页面即可延时此接口

  7. aardio用udp获取最佳本机IP地址

    此方法在有多个网络接口的时候,例如部分虚拟网卡的情况,获取最合适的本地ip. 用UDP连接虚假IP地址以获取返回的本机IP import wsock.udp.client; import consol ...

  8. java 携带session 前台传递cookie 跨域解决方案 vue + java

    前台 axios 设置 withCredentials: true 后台设置 跨域 header("Access-Control-Allow-Origin","源地址&q ...

  9. 世界银行使用.NET 7开发的免费电子问卷制作系统Survey Solution

    Survey Solution (下文简称SS) 是世界银行数据部开发的一套免费电子问卷制作系统, 官网地址为: https://mysurvey.solutions/, github地址:https ...

  10. HUAWEI WATCH GT3手表芯片传感器简析

    一 这里梳理一下华为手表GT3所使用的芯片 芯片A: BES2500L 恒玄BES2500L智能手表SoC,集存储.音频.连接为一体,集成BT5.2双模蓝牙,可支持BLE数据传输.蓝牙通话和音乐播放功 ...