单调栈就是一个栈里面要么全放升序的值,要么全是降序的值。

可以做下这道题加深理解:HDU 1506

https://vjudge.net/problem/HDU-1506

题解可以看“李二娃的博客”,里面有详细的debug过程,很直观。

https://www.cnblogs.com/lichen782/p/leetcode_Largest_Rectangle_in_Histogram.html

 

HDU 1506 AC代码:

#include <iostream>
#include <stack>
#include <cmath>
using namespace std;
const int maxn = 500010;
typedef long long ll;
ll a[maxn];
ll max(ll x,ll y){
    if(x >= y) return x;
    else return y;
}
int main()
{
    int n;
    while(scanf("%d",&n) == 1){
        if(n == 0) break;
        stack<ll> st;
        for(int i = 0;i < n;i++){
            scanf("%lld",&a[i]);
        }
        a[n] = 0;
        ll ans = 0;
        for(int i = 0;i <= n;i++){
            while(!st.empty() && a[st.top()] > a[i]){
                int cur = st.top();st.pop();//这里一定要先pop
                ans = max(ans,a[cur]*(st.empty() ? i : (i-st.top()-1)));
            }
            st.push(i);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
/*

*/