初识单调栈

P2866 [USACO06NOV]糟糕的一天Bad Hair Day

首先让我们了解一下,对于本题单调栈的一个操作思路。

没看题的戳这里→题目

先定义一个栈,然后我们遵循一个原则,我们先从头开始把奶牛的身高压入栈,(一定要记住是从前往后看)第一头直接压,不管,前面的看一下后面有没有比他高的,如果暂时没有就top- -(top是记录他*被*看的次数);直到有的时候,那么就把他

top++把他安在那里。


 
 

```cpp
    #include<cstdio>
    using namespace std;
    const int N=100005;
    int cow[N];
    long long top,ans,n;
    int main()
    {
        top=0;
        ans=0;
        scanf("%d",&n);
        int x;
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&x);
            while(top&&cow[top]<=x)
            top--;//☣
            ans+=top;
            top++;
            cow[top]=x;
        }
        printf("%lld
",ans);
}
```
原文地址:https://www.cnblogs.com/mudrobot/p/13331067.html