题解 | #小A的柱状图#

小A的柱状图

https://ac.nowcoder.com/acm/problem/23619

思路

枚举每个矩形,求出该矩形向左右两侧延伸能得到的最大矩形面积:res_i
答案就是 max(res_1,res_2,...,res_n)

代码中一些变量的解释:
l[i]:矩形 i 的左边界:从 i 向左延伸,第一个比其高度小的矩形位置
r[i]:同理

Code

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e6+10;

int l[N],r[N];
int a[N],h[N];
int stk[N];
int hh,n;

int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],a[i]+=a[i-1];
    for(int i=1;i<=n;i++) cin>>h[i];

    stk[++hh]=0;
    for(int i=1;i<=n;i++){
        while(hh&&h[i]<=h[stk[hh]]) hh--;
        l[i]=stk[hh];
        stk[++hh]=i;
    }

    hh=0;
    stk[++hh]=n+1;
    for(int i=n;i>=1;i--){
        while(hh&&h[i]<=h[stk[hh]]) hh--;
        r[i]=stk[hh];
        stk[++hh]=i;
    }

    ll res=-1;
    for(int i=1;i<=n;i++) res=max(res,(ll)h[i]*(a[r[i]-1]-a[l[i]]));
    cout<<res<<endl;

    return 0;
}
全部评论

相关推荐

用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务