【每日一题】小A的柱状图

小A的柱状图

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

Description

柱状图是有一些宽度相等的矩形下端对齐以后横向排列的图形,但是小A的柱状图却不是一个规范的柱状图,它的每个矩形下端的宽度可以是不相同的一些整数,分别为a[i]a[i],每个矩形的高度是h[i]h[i],现在小A只想知道,在这个图形里面包含的最大矩形面积是多少。
图片说明

Solution

单调栈的经典题目,但是我因为太久没做题,忘了一些细节的处理,都在代码里面标注上了。简单的说就是维护一个单调递增的序列,当遇到递减的情况时,检验前面所有可形成矩形的方案,更新答案。

Code

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e6 + 5;
const int mod = 9973;

ll l[N], r[N];

int main() {
  ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  int n; cin >> n;
  for(int i = 1; i <= n; i++) {
    cin >> l[i];
    l[i] += l[i - 1];
  }
  for(int i = 1; i <= n; i++) {
    cin >> r[i];
  }
  stack<int> st;
  long long ans = 0;
  r[n + 1] = 0; // 防止剩下矩形没有弹出栈
  st.push(0); // 防止里面越界
  for(int i = 1; i <= n + 1; i++) {
    if(st.empty() || r[i] >= r[st.top()]) st.push(i);
    else {
      while(!st.empty() && r[st.top()] > r[i]) {
        int k = st.top();
        st.pop(); // 如果没push 0, 下面一句会越界
        ans = max(ans, (l[i - 1] - l[st.top()]) * r[k]);
      }
      st.push(i);
    }
  }
  cout << ans << "\n";
  return 0;
}
Kurisu与牛客的每日一题 文章被收录于专栏

每日一题

全部评论

相关推荐

评论
7
收藏
分享
牛客网
牛客企业服务