原题链接

题意

  • 给我们一个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---简单最大类间方差法(OTSU)算法

    from matplotlib import pyplot as plt # cv2.imread()用于读取图片文件 # imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形 ...

  2. Kubernetes:kube-apiserver 之 scheme(二)

    接 Kubernetes:kube-apiserver 之 scheme(一). 2.2 资源 convert 上篇说到资源版本之间通过内部版本 __internal 进行资源转换.这里进一步扩展介绍 ...

  3. 9.17 多校联测 Day3 总结

    全程罚坐场. 模拟赛考试状态持续低迷,为明天的状态感到深深担忧. <题目并不难,请喧哗的同学不要大声 AK>,离谱. 不保证按难度顺序排序,尝试改变策略.开始第 1h 将四道题通读一遍并做 ...

  4. Linux 运行python文件时报ModuleNotFoundError: No module named 'xxxxx'

    1. 问题 运行项目文件main.py,抛出异常ModuleNotFoundError: No module named 'Environment' 2. 原因 Linux环境下,直接运行.py文件, ...

  5. QT(6)-QStandardItemModel

    @ 目录 1 说明 2 函数 2.1 构造函数 2.2 追加列\行 2.3 清除.删除并返回指定行或列 2.4 查找 2.5 设置水平\垂直表头项目 2.6 获得模型索引 2.7 插入 2.8 根项目 ...

  6. 一元多项式求和(c++源码)

    LinkList.h #ifndef LINKLIST_H_ #define LINKLIST_H_ #include<stdio.h> template<class T> s ...

  7. 在 windows 借助 git 修改文件权限

    起因: 创建新仓库的时候,仓库都没有脚本,然后就需要把运维同事的脚本复制过来,可执行脚本都是在 scripts 文件夹下面的 过了几天,来活了 刚开始还不知道咋回事,想到的文件权限是在linux系统下 ...

  8. svn 分支的创建及合并

    http://blog.csdn.net/jixiuffff/article/details/5586858 http://zhidao.baidu.com/link?url=uiRk-4ZBkLPx ...

  9. offline RL | BCQ:学习 offline dataset 的 π(a|s),直接使用 (s, π(s)) 作为 Q learning 训练数据

    题目: Off-Policy Deep Reinforcement Learning without Exploration,ICLR 2019 pdf 版本:https://arxiv.org/pd ...

  10. 【Spring Boot】【外包杯】学习day02 | 快速搭建一个Spring Boot项目

    1.