单调栈,即栈内元素保持单调性。
单调递增栈即栈内元素保持单调递增的栈:
for(i=1;i<n;i++)
{
while(!s.empty()&&a[i]<=s.top())
s.pop();
s.push(a[i]);
}
单调递减栈即栈内元素保持单调递减的栈:
for(i=1;i<n;i++)
{
while(!s.empty()&&a[i]>=s.top())
s.pop();
s.push(a[i]);
}
例题:Bad Hair Day
题意:有n只牛,给出了n只牛的身高,每只牛往右边看,在第一只牛大于等于它之前它能看到几只比它矮的牛,然后对每只牛能看到的牛数求和。
思路:题意可以理解为每头牛能被它左边的几头牛看到,然后对所有牛求和,单调递减栈就是模拟的这个过程
//#pragma GCC optimize(2)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
int main()
{
stack<int>s;
int n,x,i;
scanf("%d",&n);
scanf("%d",&x);
s.push(x);
long long ans=0;
for(i=1;i<n;i++)
{
scanf("%d",&x);
while(!s.empty()&&x>=s.top())
s.pop();
ans+=s.size();
s.push(x);
}
printf("%lld\n",ans);
return 0;
}