题目链接: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 }