POJ 1156 单调队列优化
题意
给我们一个n * m矩阵,要求我们求出一个面积最大的子矩阵,满足其内部的极差小于等于c, 同时宽度小于等于100
输入 m, n, c,求这个最大面积。n,m <= 700,c <= 10
思路
如果是暴力枚举的话,每次需要枚举子矩阵,并且扫描一遍这个子矩阵,时间复杂度是无法通过的。
我们考率另一种枚举方式,我们先枚举左边界l与右边界r,这样是100*m的复杂度。
然后我们要考虑的是在这个
\]
的长条矩阵中拿到一块符合要求的
\]
然后更新答案
如果能在线性时间内算出这个结果, 那么就是可行的算法。我们首先可以对这个长条状的子矩阵进行预处理,对每一行都预处理出它的最大值和最小值。这个操作看似是 \(O((r - l + 1) * n)\) 的,但是因为我们先枚举的左区间之后枚举的右区间,所以本次处理每行的最大最小值只需要将增加的有边界的一列数考虑进去就可以了,时间为 \(O(n)\)
之后这个子问题也就转化成了“一个序列中选出极差小于等于c的最长的一段子序列”。这是有关单向逐步移动的区间最值问题,所以可以使用单调队列,可以满足在线性时间内完成这个任务,求出 \([bottom, top]\)
总时间复杂度为 O(100 * n * m) (可能这也是题目中限定宽度为100的原因)
AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int m, n, c;
int aa[705][705];
int maxl[705], minl[705];
int quemx[705], quemn[705];
int main()
{
while (scanf("%d%d%d", &m, &n, &c) == 3)
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
scanf("%d", &aa[i][j]);
}
}
int ans = 0;
for (int l = 1; l <= m; ++l)
{
for (int i = 1; i <= n; ++i)
{
maxl[i] = aa[i][l];
minl[i] = aa[i][l];
}
int mxr = min(m, l + 99);
for (int r = l; r <= mxr; ++r)
{
for (int i = 1; i <= n; ++i)
{
maxl[i] = max(maxl[i], aa[i][r]);
minl[i] = min(minl[i], aa[i][r]);
}
int hx = 1;
int hn = 1;
int tx = 1;
int tn = 1;
int ll = 1;
for (int i = 1; i <= n; ++i)
{
while (hx != tx && maxl[quemx[tx - 1]] <= maxl[i])
{
--tx;
}
quemx[tx++] = i;
while (hn != tn && minl[quemn[tn - 1]] >= minl[i])
{
--tn;
}
quemn[tn++] = i;
while (hn != tn && hx != tx && maxl[quemx[hx]] - minl[quemn[hn]] > c)
{
++ll;
if (quemx[hx] < ll)
{
++hx;
}
if (quemn[hn] < ll)
{
++hn;
}
}
ans = max(ans, (i - ll + 1) * (r - l + 1));
}
}
}
printf("%d\n", ans);
}
return 0;
}
POJ 1156 单调队列优化的更多相关文章
- POJ - 1821 单调队列优化DP + 部分笔记
题意:n个墙壁m个粉刷匠,每个墙壁至多能被刷一次,每个粉刷匠要么不刷,要么就粉刷包含第Si块的长度不超过Li的连续墙壁(中间可不刷),每一块被刷的墙壁都可获得Pi的利润,求最大利润 避免重复粉刷: 首 ...
- POJ 2373 单调队列优化DP
题意: 思路: f[i] = min(f[j]) + 1; 2 * a <= i - j <= 2 *b: i表示当前在第i个点.f[i]表示当前最少的线段个数 先是N^2的朴素DP(果断 ...
- poj 3017 单调队列优化动态规划
思路:dp[i]=min{dp[j]+max(num[j+1]...num[i])},其中sum[i]-sum[j]<=m. 那么我们需要用单调队列维护j到i的最大值. #include< ...
- poj 2373 单调队列优化背包
思路:我们用单调队列保存2*b<=i-j<=2*a中的最大值.那么队列头就是最大值,如果队头的标号小于i-2*b的话,就出队,后面的肯定用不到它了. #include<iostrea ...
- poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...
- 【POJ】2373 Dividing the Path(单调队列优化dp)
题目 传送门:QWQ 分析 听说是水题,但还是没想出来. $ dp[i] $为$ [1,i] $的需要的喷头数量. 那么$ dp[i]=min(dp[j])+1 $其中$ j<i $ 这是个$ ...
- poj 3017 Cut the Sequence(单调队列优化 )
题目链接:http://poj.org/problem?id=3017 题意:给你一个长度为n的数列,要求把这个数列划分为任意块,每块的元素和小于m,使得所有块的最大值的和最小 分析:这题很快就能想到 ...
- POJ 1821 Fence(单调队列优化DP)
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...
- POJ 1742 (单调队列优化多重背包+混合背包)
(点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
随机推荐
- Linux系列教程——Shell、Linux文件管理
文章目录 Shell 1.什么是Bash shell(壳) 2.Bash Shell能干什么? 3.平时我们如何使用Shell呢? 4.Shell提示符 5.Shell基础语法 2.Bash Shel ...
- CIC滤波器仿真与实验过程及结果记录
整理于2023-10-08 0.0 前言: 前面介绍了使用matlab中的Filter Designer工具箱进行CIC抽取滤波器设计的仿真过程与结果.下面在前面的基础上针对现有的[正点原子ZYNQ] ...
- junit4单元测试报错Invalid project specified
junit4单元测试报错Invalid project specified. 前天在进行单元测试的时候出现了Invalid project specified的报错查了一下发现是项目名字的问题.项目名 ...
- CF1368B
题目简化和分析: 因为要求长度最小,所以我们每个字符就应该发挥最大的价值,不会有没有作用的字符. 设有 \(x_1\) 个 \(c\) ,\(x_2\) 个 \(o\) ,\(x_3\) 个 \(d\ ...
- Kraft模式下Kafka脚本的使用
Kafka集群 版本:V3.5.1 名称 Node1 Node2 Node3 IP 172.29.145.157 172.29.145.182 172.29.145.183 (1)查看Kraft集群中 ...
- 【Unity3D】UI Toolkit容器
1 前言 UI Toolkit简介 中介绍了 UI Builder.样式属性.UQuery.Debugger,UI Toolkit元素 中介绍了 Label.Button.TextField.To ...
- C++ 与 QML 之间进行数据交互的几种方法
一.属性绑定 这是最简单的方式,可以在QML中直接绑定C++ 对象的属性.通过在C++ 对象中使用Q_PROPERTY宏定义属性,然后在QML中使用绑定语法将属性与QML元素关联起来. person. ...
- PKUSC & GDCPC 2023 游记
离得太近,游记打算扔一起. 有没有神仙面基啊 /kel. PKUSC 2023 Day -? 突然听说不给 NOI Linux,震惊. 前情提要:在从 CSP 开始就全员强制 linux 的 LN 为 ...
- JavaScript高级程序设计笔记02 HTML中的JavaScript
HTML中的JavaScript <script>元素 形式 行内 其中的代码会被从上到下解释.计算完成之前,页面其余内容不会被加载,也不会被显式. 外部 下载与解析都会阻塞HTML解析, ...
- 国企项目就用国产的 Solon Java Framework,v2.5.12 发布
Solon 是什么框架? Java 新的生态级应用开发框架.国产.从零开始构建,有自己的标准规范与开放生态(历时五年,具备全球第二级别的生态规模).与其他框架相比,解决了两个重要的痛点:启动慢,费内存 ...