原题链接

题意

  • 给我们一个n * m矩阵,要求我们求出一个面积最大的子矩阵,满足其内部的极差小于等于c, 同时宽度小于等于100

  • 输入 m, n, c,求这个最大面积。n,m <= 700,c <= 10

思路

  • 如果是暴力枚举的话,每次需要枚举子矩阵,并且扫描一遍这个子矩阵,时间复杂度是无法通过的。

  • 我们考率另一种枚举方式,我们先枚举左边界l与右边界r,这样是100*m的复杂度。

  • 然后我们要考虑的是在这个

\[[l, r] * [1, n]
\]

的长条矩阵中拿到一块符合要求的

\[[l, r] * [bottom, top]
\]

然后更新答案

  • 如果能在线性时间内算出这个结果, 那么就是可行的算法。我们首先可以对这个长条状的子矩阵进行预处理,对每一行都预处理出它的最大值和最小值。这个操作看似是 \(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 单调队列优化的更多相关文章

  1. POJ - 1821 单调队列优化DP + 部分笔记

    题意:n个墙壁m个粉刷匠,每个墙壁至多能被刷一次,每个粉刷匠要么不刷,要么就粉刷包含第Si块的长度不超过Li的连续墙壁(中间可不刷),每一块被刷的墙壁都可获得Pi的利润,求最大利润 避免重复粉刷: 首 ...

  2. POJ 2373 单调队列优化DP

    题意: 思路: f[i] = min(f[j]) + 1; 2 * a <= i - j <= 2 *b: i表示当前在第i个点.f[i]表示当前最少的线段个数 先是N^2的朴素DP(果断 ...

  3. poj 3017 单调队列优化动态规划

    思路:dp[i]=min{dp[j]+max(num[j+1]...num[i])},其中sum[i]-sum[j]<=m. 那么我们需要用单调队列维护j到i的最大值. #include< ...

  4. poj 2373 单调队列优化背包

    思路:我们用单调队列保存2*b<=i-j<=2*a中的最大值.那么队列头就是最大值,如果队头的标号小于i-2*b的话,就出队,后面的肯定用不到它了. #include<iostrea ...

  5. poj 1821 Fence 单调队列优化dp

    /* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...

  6. 【POJ】2373 Dividing the Path(单调队列优化dp)

    题目 传送门:QWQ 分析 听说是水题,但还是没想出来. $ dp[i] $为$ [1,i] $的需要的喷头数量. 那么$ dp[i]=min(dp[j])+1 $其中$ j<i $ 这是个$ ...

  7. poj 3017 Cut the Sequence(单调队列优化 )

    题目链接:http://poj.org/problem?id=3017 题意:给你一个长度为n的数列,要求把这个数列划分为任意块,每块的元素和小于m,使得所有块的最大值的和最小 分析:这题很快就能想到 ...

  8. POJ 1821 Fence(单调队列优化DP)

    题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...

  9. POJ 1742 (单调队列优化多重背包+混合背包)

    (点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...

  10. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

随机推荐

  1. Python学习 —— 初步认知

    写在前面 Python是一种流行的高级编程语言,具有简单易学.代码可读性高.应用广泛等优势.它是一种解释型语言,可以直接在终端或集成开发环境(IDE)中运行,而无需事先编译. Python的安装 Py ...

  2. svn: E200007: Retrieval of mergeinfo unsupported解决

     http://blog.csdn.net/intlgj/article/details/39080605 svn: E200007: Retrieval of mergeinfo unsupport ...

  3. 02-oracle11g rac RMAN备份恢复至单机(未验证)

    在一节点上进行全备确定备份路径,并赋予属组mkdir /rmanbackupchown oracle:oinsatll /rmanbackup进入rman进行全备rman target /run{al ...

  4. EMC ndmp NAS

    NAS 是带存储系统的专用高性能文件服务器.它可提供文件级数据访问和共享. NAS 使用网络和文件共享协议,包括用于数据传输的 TCP/IP 以及用于远程文件服务的 CIFS 和 NFS. 最简单的备 ...

  5. .then()方法的意思和用法

    then()方法是异步执行. 意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题. 语法:promise.then(onCompleted, ...

  6. 使用卷积神经网络训练手写数字识别模型(CNN)

    https://www.cnblogs.com/zylyehuo/ 效果展示 目录结构 README.md # Basic MNIST Example pip install -r requireme ...

  7. H5-geolocation学习

    geolocation--定位 PC--IP地址 精度比较低 IP库 Chrome -> Google 手机--GPS window.navigator.geolocation 单次 getCu ...

  8. P1522 [USACO2.4] 牛的旅行 Cow Tours

    Problem 题目简述 给你两个独立的联通块,求:在两个联通块上各找一个点连起来,使得新的联通块的直径的最小值. 思路 本题主要做法:\(Floyd\). 首先,Floyd求出任意两个点之间的最短路 ...

  9. oceanbase 标量子查询等价改写(复杂)

    OB一哥们找我优化条SQL,反馈在OceanBase执行时间很慢需要 3184s才能出结果,安排. 原SQL: select M.POLICY_CHARGE_ID as policyChargeId, ...

  10. STM32F407 MCO输出的配置问题

    当前使用IDE: RT-Thread Studio 版本: 2.1.0 构建ID: 202103221400 配置如下: int MCO1_GPIO_INIT(void) { GPIO_InitTyp ...