1 条题解
-
0
- 尝试枚举每一个数 作为矩形的高
- 那么从 往左右扩展的条件是,不能碰到比 小的数
- 也就是对每个 ,要分别找到往左和往右第一个比 小的数
#include <bits/stdc++.h> using namespace std; int gao(vector<int>& h) { int n = h.size(); vector<int> L(n, -1); // L[i]: 表示 i 左边第一个比 h[i] 小的下标 vector<int> R(n, n); // R[i]: 表示 i 右边第一个比 h[i] 小的下标 int e = 0; vector<int> s(n); // 只扫一遍, 同时确定 L 和 R for (int i = 0; i < n; i++) { // 出栈的时候确定右边第一个比自己小的 while (e > 0 && h[s[e - 1]] > h[i]) R[s[--e]] = i; // 入栈的时候确定左边第一个比自己小的 if (e > 0) L[i] = s[e - 1]; s[e++] = i; } // for (int i = 0; i < n; i++) cout << L[i] << " \n"[i == n - 1]; // for (int i = 0; i < n; i++) cout << R[i] << " \n"[i == n - 1]; int ans = 0; for (int i = 0; i < n; i++) ans = max(ans, h[i] * (R[i] - L[i] - 1)); return ans; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; cin >> n; vector<int> h(n); for (int i = 0; i < n; i++) cin >> h[i]; cout << gao(h) << '\n'; return 0; }
- 1
信息
- ID
- 160
- 时间
- 100ms
- 内存
- 32MiB
- 难度
- 5
- 标签
- 递交数
- 61
- 已通过
- 24
- 上传者