Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 28460 Accepted Submission(s): 9279
#include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <string> #include <map> #include <iomanip> #include <algorithm> #include <queue> #include <stack> #include <set> #include <vector> //const int maxn = 1e5+5; #define ll long long #define inf 0x3f3f3f3f #define FOR(i,a,b) for( int i = a;i <= b;++i) #define bug cout<<"--------------"<<endl ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} ll lcm(ll a,ll b){return a/gcd(a,b)*b;} const int maxn = 100100; using namespace std; ll a[maxn]; int n; int l[maxn],r[maxn]; int main() { //freopen("C:\\ACM\\input.txt","r",stdin); while(scanf("%d",&n) != EOF) { if(n == 0) break; ll maxx = 0; for(int i = 1;i <= n; ++i) scanf("%I64d",&a[i]); stack<int>sta; for(int i = 1;i <= n; ++i) { while(sta.size() && a[i] <= a[sta.top()]) sta.pop(); if(sta.size()) l[i] = sta.top() + 1; else l[i] = 1; sta.push(i); } while(sta.size()) sta.pop(); for(int i = n;i >= 1; --i) { while(sta.size() && a[i] <= a[sta.top()]) sta.pop(); if(sta.size()) r[i] = sta.top() - 1; else r[i] = n; sta.push(i); } for(int i = 1;i <= n; ++i) { //cout<<l[i]<<" "<<r[i]<<endl; ll temp = a[i] * (r[i] - l[i] + 1); maxx = max(temp ,maxx); } printf("%I64d\n",maxx); } }
原文:https://www.cnblogs.com/jrfr/p/11673181.html