Files
python/TangDou/LanQiaoBei/LanQiao14ShengSai/4_Stack.cpp

49 lines
1.6 KiB
C++
Raw Normal View History

2025-08-30 18:35:01 +08:00
#include <bits/stdc++.h>
using namespace std;
const int N = 10000010;
int a[N];
int res;
/*
测试样例I
6
3 2 1 4 5 2
输出:
8
测试样例II
5
2 4 3 4 5
输出:
12
*/
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
stack<int> stk;
for (int i = 0; i <= n; i++) { // 注意:这里是0~n,其实数组中有效数据是0~n-1,之所以最后要多枚举一个n,是因为栈内可能存在一直找不到右手边比自己小的数据,最后补一个0,让它们都出栈
while (stk.size() && a[i] <= a[stk.top()]) { // 栈不为空,并且,当前柱子高度小于栈顶柱子高度,此时,栈顶柱子找到了右手边的最远距离
int h = a[stk.top()]; // 栈顶柱子高度
stk.pop(); // 栈顶柱子出栈
/*
举例子:当前i=6,那么右边界是5。左侧有两种情况:
1、栈里还有元素,那么stk.top()就是左侧的第一个比当前元素小的位置,比如是3,那么5-3=2,
也就是当前元素向左是3(不包3),
向右到5(包含5),那么就是【4,5】两个位置
2、栈里没有元素,此时,找到右边界是5,左侧起点就是0,共【0,1,2,3,4,5】共6个,也就是i
*/
int w = (stk.size() == 0 ? i : i - 1 - stk.top());
res = max(res, h * w);
}
stk.push(i);
}
cout << res << endl;
return 0;
}