单调栈
概念:单调递增或单调减的栈,跟单调队列差不多,但是只用到它的一端;
用处:
1,在线性数据中可以在O(n)的时间复杂度内记录数据的最大值最小值及前缀后缀中的最值(nlog(n));
2,在线性数据中可以在O(n)的时间复杂度内记录下每一个位置中比当前位置大(小)的最近位置;
注意:
1,通常在单调栈中存的是data【】的下标而不是其中的值,因为通过下标我们可以找到值而通过值却找不到下标;
2,单调栈通常与区间最值问题联系,在考虑用线段树或树状数组前先考虑能否用单调栈(队列);
下面我们来看几个例题:
1,
分析:这到题很明显用单调栈,因为我们只考虑一个方向,后来面的一定比前面的小是单调的,由此仅仅会是连续的,而且在单调队列里我们存的数组下标由此我们就可以通过下标之间的相减来确定与之最近的data【】的下标;
代码如下:
include
include
using namespace std;
const int maxn=10000;
int data[maxn],stack[maxn];
int main()
{
int n,ans=0,top=1;
scanf(“%d%d”,&n,&data[1]);
stack[1]=1;
for(int i=2;i<=n;i++)
{
scanf(“%d”,&data[i]);
if(data[i]