51nod——2476 小b和序列(预处理 思维)

  对于每一个元素,预处理出它作为最小值,两边可以作用到的最大位置。比如下标∈[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 }

 

转载于:https://www.cnblogs.com/noobimp/p/10946960.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值