Largest Rectangle in a Histogram(单调栈)

Largest Rectangle in a Histogram(单调栈)_第1张图片

Sample Input

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

Sample Output

8
4000

求题意就是让求最大的矩形面积。

思路:这里我们既然相求最大的矩形面积,所以我们就判断以单个单个矩形的高为起点,想左右拓展的最元距离。最后维护一个最大值。但是我们用暴力判断能向左右拓展多远明显时间复杂度又不够,所以我们采用单调栈的思想,比如我们先从左到右判断以没个点为高的左边界时,我们就从左到右维护一个递增的栈。每次判断下标所在的值,与栈顶所在的值得关系。如果当前值比栈顶的值小或者相等,那么就弹出栈顶元素,继续判断知道找到比当前元素小的栈顶元素,那这个栈顶元素就是当前值得左边界。右边界同理从右边跑一遍即可。

#include 
#include 
#include 
#include 
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1e6+100;
typedef long long ll;
int a[maxn], n, l[maxn], r[maxn];
int main()
{
    while(cin>>n&&n)
    {
        memset(l, 0, sizeof l);
        memset(r, 0, sizeof r);
        for (int i = 1; i <= n;i++)
            cin >> a[i];
        stack<int> st;
        for (int i = 1; i <= n;i++)
        {
            while(!st.empty()&&a[i]<=a[st.top()])
            {
                st.pop();
            }

            if(st.empty())
                l[i] = 1;
            else
                l[i] = st.top()+1;

            st.push(i);
        }
        while(!st.empty())
            st.pop();

        for (int i = n; i >= 1;i--)
        {
            while(!st.empty()&&a[i]<=a[st.top()])
            {
                st.pop();
            }
            if(st.empty())
                r[i] = n+1;
            else r[i]=st.top();

            st.push(i);
        }
        ll ans = 0;

        for (int i = 1; i <= n;i++)
            ans = max(ans, 1ll * a[i] * (r[i] - l[i]));

        cout << ans << endl;
    }
    //system("pause");
    return 0;
}

你可能感兴趣的:(单调栈单调队列)