何为单调栈:
顾名思义,单调栈即满足单调性的栈结构。
用伪代码来表述:

insert x
while !sta.empty() && sta.top()<x
    sta.pop()
sta.push(x)

例:Poj3250

n个牛排成一列向右看,牛i能看到牛j的头顶,当且仅当牛j在牛i的右边并且牛i与牛j之间的所有牛均比牛i矮。 设牛i能看到的牛数为Ci,求∑Ci

这道题正确解法是单调栈:
单调栈-----所谓单调栈也就是每次加入一个新元素时,把栈中小于等于这个值的元素弹出。
以样例来说:
一开始读一只高度为10的牛,此时栈中没有牛可以看到它,ans+=0,10入栈。
读3,可被10看见,ans+=1,3入栈。
读7,可被10看见,不可被3看见,3pop掉,ans+=1,7入栈。
读4,可被10看见,可被7看见,ans+=2,4入栈。
读12,不可被10看见,不可被7看见,不可被4看见,清空栈,ans+=0,12入栈。
读2,可被12看见,ans+=1,2入栈。最后ans=5.

#include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
using namespace std;
int main()
{
   
	int n,t;
	long long ans=0;
	stack<int> sta;
	scanf("%d",&n);
	scanf("%d",&t);
	sta.push(t);
	for(int i=1; i<n; i++){
   
		scanf("%d",&t);
		while(!sta.empty() && sta.top()<=t)
			sta.pop();
		ans+=sta.size();
		sta.push(t);
	}
	printf("%lld\n",ans);
 }