说明
单调栈:就是栈中存储元素的某种信息是单调的栈
里面的数据是单调递增 单调递减或者严格单调。
应用
• 单调栈可以干什么呢?
• 可以线性寻找一个元素左边(或右边)第一个满足某种条件的元素
• 比较常见的问题是:给定一个序列,对于每个数寻找其左边(或右边)第一个比它大(或比它小)的数
例题
poj3250
题目大意是
一群高度不完全相同的牛从左到右站成一排,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛后面的其他牛。
给出这些牛的高度,要求每头牛可以看到的牛的数量的和。
思路:计算每头牛可以看到牛的头数,可以等效于每头牛可以被看到的次数
从左到右依次读取当前牛的高度,从栈顶开始把高度小于或等于当前牛的高度的那些元素删除,此时栈中剩下的元素的数量就是可以看见当前牛的其他牛的数量,求和就是答案。
代码如下
#include<stdio.h>
#define LL long long
int maxn=80005;
int s[maxn],top=0,N=0;
main()
{
int num=0;
LL ans=0;
scanf("%d",&N);
while(N--){
scanf("%d",&num);
while(top>0&&s[top-1]<=num)top--;
ans+=top;
s[top++]=num;
}
printf("%lld\n",ans);
}