对于每一个元素,预处理出它作为最小值,两边可以作用到的最大位置。比如下标∈[0,8]的这个数组:1 8 6 2 5 4 3 8 7,1可以作用到所有区间,2可以作用到区间[1,8],第一个8可以作用到[1,7]。也就是说从两边分别找到第一个大于等于这个元素的位置,然后标记,其实就是找最宽的区间长度。可能左边更宽也可能右边更宽,对所有元素的max(a[i]*(i-l[i])),a[i]*(r[i]-i)) 求max就是答案了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define maxn 50050 4 int a[maxn],l[maxn],r[maxn]; 5 int main(){ 6 std::ios::sync_with_stdio(0); 7 cin.tie(0); 8 int n; cin>>n; 9 for(int i=0;i<n;i++) cin>>a[i]; 10 11 for(int i=0;i<n;i++){//预处理 找到可以以a[i]为最小值的区间 12 int ll=0,rr=n-1; 13 while(a[ll]<a[i]) ll++; 14 l[i]=ll; 15 while(a[rr]<a[i]) rr--; 16 r[i]=rr; 17 } 18 int maxx=0; 19 20 for(int i=0;i<n;i++) 21 maxx=max(max(maxx,a[i]*(i-l[i])),a[i]*(r[i]-i)); 22 cout<<maxx<<endl; 23 return 0; 24 }