单调栈小结

单调栈

单调栈是解决这样一类问题

给出$n$个数,问每一个数向左第一个比它小的数是谁

如果直接暴力的话,最坏情况下肯定是$O(n^2)$的,但是单调栈可以在$O(n)$的时间内解决这类问题

实现

单调栈,顾明思议嘛,就是维护一个具有单调性的栈,至于是单调递增还是单调递减,这个视题目而定

对于上面那个问题而言,我们需要维护一个单调上升的序列

加入一个元素的时候,若当前元素比栈顶元素小,那么就不断的弹出栈顶元素,直到整个栈满足单调

那么该位置向左第一个比它小的就是栈顶

上面说的太抽象了

比如,我们有一个序列$2,4,3,5,2$

设$ans[i]$表示第$i$个位置的答案

$2$加入序列,此时序列为$2$,$ans[1]=0$

$4$加入序列,此时序列为$2,4$,$ans[2]=2$

$3$加入序列,我们发现,如果将$3$直接加入序列,此时序列将不满足单调性,于是先删除$4$,再加入$3$,此时序列为$2,3$,$ans[3]=2$

$5$加入序列,此时序列为$2,3,5$,$ans[4]=5$

$2$加入序列,删除$2,3,5$,加入$2$,此时序列为$2$,$ans[5]=0$

考虑每一个元素最多被加入/删除一次,因此时间复杂度为$O(n)$

至于为什么,感觉挺显然的吧,就是利用单调性

例题

都是些水题

洛谷P2688

题解

HDU1506

题解

BZOJ1007

有些难度,用到了单调栈的思想

题解

原文地址:https://www.cnblogs.com/zwfymqz/p/8964663.html

时间: 2024-12-26 08:36:17

单调栈小结的相关文章

小结:单调栈 & 单调队列

概要: 对于维护信息具有单调性的性质或者问题可以转化为具有单调性质的模型的题,我们可以考虑用单调栈或单调队列. 技巧及注意: 技巧很多,只要能将问题转化为单调性问题,就好解决了. 当维护固定长度的单调区间,我们考虑用单调队列,如[BZOJ]3314: [Usaco2013 Nov]Crowded Cows(单调队列) 单调栈维护长度时要进行及时更新,例如:[BZOJ]3039: 玉蟾宫(DP/单调栈) 假设完美状态后再进行减法原理,例如:[BZOJ]1628 && 1683: [Usaco

[bzoj2086][Poi2010]Blocks_单调栈_双指针

Blocks bzoj-2086 Poi-2010 题目大意:题目链接. 注释:略. 想法:首先,不难发现,如果连续的一段数的平均值不小于输入的k的话,这段数是满足题意的. 所以,我们再次简化一下:将每个数都减去k,即求极大区间,使得区间和为正. 将所有数的前缀和自尾至头压进单调栈,然后左指针遍历1->n,右指针在单调栈上扫即可. 最后,附上丑陋的代码... ... #include <iostream> #include <cstdio> #include <cstr

[数据结构]单调栈的基本应用2

[数据结构]单调栈的基本应用2 一.前言 单调栈的基本应用2是单调栈的基本应用1的延伸.应用2主要解决的是二维平面的一些问题. 二.基本应用2 虽然已经应用到二维平面,但是单调栈的思想并没有变化 更多应用的是延伸的位置.本质是ai的左/右第一个大于ai的元素位置 下面列举的一些平面内单调栈的例题: 例1: POJ2559 最大矩形面积 题目描述: 给定n个依次排列并且面积为1*hi的矩形,现求这个图形所包含最大的矩形的面积. 上图中7个矩形的h依次为2 1 4 5 1 3 3.注意题目有多组数据

(单调栈)poj-2559 Largest Rectangle in a Histogram

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the

【单调栈】hdu1506 Largest Rectangle in a Histogram

单调栈的介绍及一些基本性质 http://blog.csdn.net/liujian20150808/article/details/50752861 依次把矩形塞进单调栈,保持其单增,矩形中的元素是一个三元组,存储其位置,高度,以及以其为高度的情况下,大矩形的左边界最多扩展到哪里. 每次将新的元素塞进栈的时候,其左边界就是其左侧第一个小于它的矩形的位置+1. 然后,每个矩形出栈的时候,记录其右边界为当前往栈里面塞的矩形的位置-1,然后更新答案即可. 注意最后把所有的矩形出栈,更新答案. #in

BZOJ 3238 AHOI 2013 差异 后缀数组+单调栈

题目大意: 思路:一看各种后缀那就是后缀数组没跑了. 求出sa,height之后就可以乱搞了.对于height数组中的一个值,height[i]来说,这个值能够作为lcp值的作用域只在左边第一个比他小的位置到右边第一个比他小的位置.这个东西很明显可以倍增RMQ+二分/单调栈. 之后就是数学题了 Σlen[Ti] + len[Tj] = (len + 1) * len * (len - 1),之后吧所有求出来的Σ2 * lcp(Ti,Tj)减掉就是答案. 记得答案开long long CODE:

51nod 1215 数组的宽度&amp;poj 2796 Feel Good(单调栈)

单调栈求每个数在哪些区间是最值的经典操作. 把数一个一个丢进单调栈,弹出的时候[st[top-1]+1,i-1]这段区间就是弹出的数为最值的区间. poj2796 弹出的时候更新答案即可 #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> #include<cmath

[poj3250]单调栈 Bad Hair Day

解题关键:将每头牛看到的牛头数总和转化为每头牛被看到的次数,然后用单调栈求解,其实做这道题的目的只是熟悉下单调栈 此题为递减栈 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<stack> 6 #include<iostream> 7 using namespace std; 8 typedef lo

HDU 5033---Building(单调栈)

题目链接 Problem Description Once upon a time Matt went to a small town. The town was so small and narrow that he can regard the town as a pivot. There were some skyscrapers in the town, each located at position xi with its height hi. All skyscrapers loc