zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    各种犯下的错误(2)
    c3p0封装
    servlet模板
    各种犯下的错误(1)
    连接池的创建与封装
    jdbc连接用工具类
    Java从入门到入坟(1)
    小米商城网页版(js+css)
    JavaScript学习篇(9)
    JavaScript学习篇(8)
  • 原文地址:https://www.cnblogs.com/noobimp/p/10946960.html
Copyright © 2011-2022 走看看