7 条题解

  • -1
    @ 2023-5-26 17:23:36

    思路:

    我们找到左边第一个比他小和右边第一个比它小的,就可以得知这个高度的矩形的宽**
    

    代码:

    #include<iostream>
    #include<stack>
    #define int long long
    using namespace std;
    stack<int> st;
    int h[100005],n,to,l[100005],r[100005],ans;
    signed main(){
        while(cin>>n,n){
            for(int i=1;i<=n;i++) cin>>h[i];
            h[0]=-1;
            st.push(0);
            for(int i=1;i<=n;i++){
                while(!st.empty()&&h[i]<=h[st.top()]) st.pop();
                l[i]=st.top();
                st.push(i);
            }
            while(!st.empty()) st.pop();
            h[n+1]=-1;
            st.push(n+1);
            for(int i=n;i>=1;i--){
                while(!st.empty()&&h[i]<=h[st.top()]) st.pop();
                r[i]=st.top();
                st.push(i);
            }
            ans=0;
            for(int i=1;i<=n;i++){
                ans=max(ans,(r[i]-l[i]-1)*h[i]);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    
    
    

    信息

    ID
    42
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    221
    已通过
    89
    上传者