题目链接: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 }
时间: 2024-10-16 09:15:18