51nod1102(单调栈/预处理)

Posted ygeloutingyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod1102(单调栈/预处理)相关的知识,希望对你有一定的参考价值。

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102

 

题意:中文题诶~

 

思路:单调栈/预处理 (这篇博客就不细写了啦,只给出代码和转过来的两篇不错的题解,好困了~)

 

单调栈:http://blog.csdn.net/u012773338/article/details/40265223

代码:

#include <iostream>
#include <stack>
#define ll long long
#define MAXN 50010
using namespace std;

ll a[MAXN], ans=0;
stack<int> st;

int main(void){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int n;
    cin >> n;
    for(int i=0; i<n; i++){
        cin >> a[i];
    }
    a[n]=-1;
    for(int i=0; i<=n; i++){
        if(st.empty()||a[i]>=a[st.top()]){
            st.push(i);
        }else if(a[i]<a[st.top()]){
            int cnt;
            while(!st.empty()&&a[i]<a[st.top()]){
                ans=max(ans, a[st.top()]*(i-st.top()));
                cnt=st.top();
                st.pop();
            }
            st.push(cnt);
            a[cnt]=a[i];
        }
    }
    cout << ans << endl;
    return 0;
}

 

预处理:http://blog.csdn.net/queuelovestack/article/details/52326276

代码:

 1 #include <iostream>
 2 #define ll long long
 3 #define MAXN 50010
 4 using namespace std;
 5 
 6 ll l[MAXN], r[MAXN], a[MAXN];
 7 
 8 int main(void){
 9     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
10     int n;
11     cin >> n;
12     for(int i=1; i<=n; i++){
13         cin >> a[i];
14     }
15     for(int i=1; i<=n; i++){
16         int k=i-1;
17         while(a[i]<=a[k]){
18             k=l[k]-1;
19         }
20         l[i]=k+1;
21     }
22     for(int i=n; i>0; i--){
23         int k=i+1;
24         while(a[i]<=a[k]){
25             k=r[k]+1;
26         }
27         r[i]=k-1;
28     }
29     ll ans=0;
30     for(int i=1; i<=n; i++){
31         ans=max((r[i]-l[i]+1)*a[i], ans);
32     }
33     cout << ans << endl;
34 }

 

以上是关于51nod1102(单调栈/预处理)的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1102 面积最大的矩形 (单调栈)

51nod 1102 面积最大的矩形 && 新疆大学OJ 1387: B.HUAWEI's billboard 单调栈+拼凑段(o(n) 或 o(nlog(n))

51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))

51nod 1279单调栈扔盘子

51nod1423 最大二"货" 单调栈

51nod1158 单调栈 个人的想法以及分析