单调栈/队列
文章平均质量分 86
单调栈、单调队列
Happig丶
我的孤独,虽败犹荣
展开
-
洛谷 P1950 长方形(单调栈)
传送门 题目大意 给出一个 n∗m(1≤n,m≤1000)n*m(1 \leq n, m \leq 1000)n∗m(1≤n,m≤1000) 的矩阵,矩阵元素可以为 ‘.’, ‘*’。求出所有的仅有 ... 包含的矩形的个数。 解题思路 这题应该由两个部分构成,一是如何统计矩形,二是如何不重不漏且在时间复杂度内统计矩形。 统计矩形 若没有 ‘*’ 的限制在矩阵内找有多少个矩形,实际上就是这道题的一个简化版:P2241 统计方形。 考虑矩形的性质,可以由如下角度入手去统计: 固定矩形的左上角和右下角,可以原创 2021-08-11 19:57:04 · 279 阅读 · 1 评论 -
POJ - 3494 Largest Submatrix of All 1’s(单调栈+降维)
传送门 这题开始知道是用单调栈做,然后我一开始想的是先求出每个111最右边最后一个111也就是第一个小于它的数;同理求出最下面的第一个小于它的数。这样我们枚举每一个111作为矩形的左上角然后想办法求出每行的最小的,然后每行的每个位置上下最小的似乎又要用单调栈做,这也太麻烦了,没有心思写下去了想去看看正解 实际上是化二维为一维,对于某一行或者某一列来说,我们完全可以看做它下面连续的一块111累加而来形成一个高度,这样问题就变成了这种一维的高度求某块的最大矩形区域的问题: 因此我们将每列从上到下累加,然后枚原创 2020-08-01 21:45:36 · 160 阅读 · 0 评论 -
POJ - 2796 Feel Good(经典单调栈)
传送门 这个题在紫书做过,UVA1619当时看的题解是写的链表,现在学习单调栈需要搞懂这个题的单调栈写法 首先单调栈容易搞晕人的一点是,如果我们求左边/右边第一个小于它的值的位置,那么维护的单调栈从上到下是单调递减的,不能这么想:因为是小于它的所以是单调递增的,应该从“大于等于它的元素出栈,那么单调性就是单调递减的”这点出发 #include <math.h> #include <cstring> #include <cstdio> #include <algo原创 2020-08-01 21:27:22 · 170 阅读 · 0 评论 -
洛谷P1714 切蛋糕(单调队列经典问题)
传送门 一开始很容易想到尺取,但是好像又不太一样,尺取解决的一般是区间和接近某个数或者区间内讨论数的种类个数,而本题实际上是解决最大不定长连续子段和 然后不难想到最大连续和的经典问题,然后不难想到前缀和的O(n2)O(n^2)O(n2)算法,显然会TLETLETLE,那么参考最大连续和的前缀和优化: 假设以第jjj个数为终点的最大子序列和的起点是iii,于是结果为sum[j]−sum[i−1]sum[j] - sum[i-1]sum[j]−sum[i−1]。因为我们要维护最大前缀和,sum[i−1]sum原创 2020-07-31 13:25:52 · 374 阅读 · 0 评论 -
HDU - 6759 Leading Robots(单调栈)
传送门 Reference:https://blog.csdn.net/qq_44828887/article/details/107499606 首先需要明确的三点是: 加速度较大者可能当第一 位置靠前者可能当第一 重复的起点和加速度的机器人不可能当第一 明显,加速度是衡量当第一的第一标准,位置是第二标准。按照加速度升序处理,加速度相同按起点升序处理,这样排序之后,依次入栈。每次入栈时需要考虑:如果后面的机器人起点大于栈顶起点(其加速度是肯定大于等于栈顶),那么就需要不断出栈直到不满足为止。如果栈内原创 2020-07-24 21:39:53 · 255 阅读 · 0 评论 -
滑动窗口的最大值(经典单调队列问题)
题目链接 首先不难分析窗口是这样滑动的: 如果我们使用尺取/滑动窗口,时间复杂度为O(n*k),当k很大时容易超时。本题采用单调队列优化 所谓单调队列即双端队列,队列中的值是单调的,在每次滑动之后维持队列的单调性 对于本题来说,每次都是最左端的数移除队列,最右边的数加入队列,由于队列的单调性我们直接取队列的两端处的某个值,即为区间最值 对于此题来说需要降序的单调队列: 对于新加入的数,我们需...原创 2020-05-07 23:17:36 · 516 阅读 · 0 评论 -
Contest Hunter - 1201 最大子序和(单调队列)
题目链接 1.最大子序和问题,应该是比较常见的,但是这道题需要我们求最大的n原创 2020-03-27 10:39:16 · 152 阅读 · 0 评论 -
洛谷P1725 琪露诺(单调队列+dp)
传送门 设d[i]d[i]d[i]表示跳到位置iii的最小值,那么不难想到状态转移方程为: d[i]=max{d[i−j]}+a[i],i−r≤j≤i−ld[i]=max\{d[i-j]\}+a[i],i-r\leq j \leq i-ld[i]=max{d[i−j]}+a[i],i−r≤j≤i−l 本题可以写填表法,但是显然刷表法(由当前状态更新未来状态)更好。因为区间[i−r,i−l][i-r,i-l][i−r,i−l]长度是固定的,那么我们可以使用单调队列O(1)O(1)O(1)取得最值,这时来了一原创 2020-07-31 19:13:05 · 255 阅读 · 0 评论