最大矩形面积
如果栈为空,或者新的元素是大于栈顶元素的,那么新来的元素不会破坏栈的单调性,那么就把这个柱子入栈。
特别注意:这里的s.empty()和s.top().height < a不能调换顺序,包括后面的判断也要先判断栈是否为空。c++中的&&和||是短路与和短路或,但一个栈是空的时候,我们再去调用这个栈的栈顶,会报错,所以我们先去判断栈时候为空,如果是空的话,表达式s.empty() || s.top().height < a 已经为true了,那么这个表达式就被||短路了,也就是s.top().height < a就不会被执行了,也就是top一定不会去作用到一个空栈上。包括下面的!s.empty() && s.top().height >= a的表达式不能调换位置
这里的话我们去判断,如果栈不为空的时候并且新来的元素小于栈顶元素,那么新来的元素就破坏了栈的单调递增
那么我们就需要把这个栈的栈顶出栈,直到这个数进栈后不会破坏这个栈的单调递增。
我们用temp_height来存储这个栈顶的元素的高度,此时搞定了矩阵的高度。
至于矩阵的宽度,我们想一下,此时加进去的a比栈顶元素矮,那么a这个元素一定是栈顶元素右侧第一个小于a的元素,此时我们把栈顶元素出栈,此时的栈顶元素就是左侧第一个小于的元素
所以可以得出代码
#include<bits/stdc++.h>
using namespace std;
struct n {
int height, index;
}temp;
stack<n> s;
int num, a, length, temp_height, temp_w;
long long ans;
int main(){
while (cin >> num && num) {
for (int i = 1; i <= num; i++) {
scanf_s("%d", &a);
if (s.empty() || s.top().height < a) {
temp.height = a;
temp.index = i;
s.push(temp);
}
else if (!s.empty() && s.top().height >= a) {
while (!s.empty() && s.top().height >= a) {
temp_height = s.top().height;
s.pop();
if (s.empty()) {
length = i - 1;
}
else {
length = i - s.top().index - 1;
}
ans = max(ans, (long long)length * temp_height);
}
temp.height = a;
temp.index = i;
s.push(temp);
}
if (!s.empty() && i == num) {
while (!s.empty()) {
temp_height = s.top().height;
temp_w = s.top().index;
if (s.size() == 1) {
length = temp_w;
s.pop();
}
else {
s.pop();
length = temp_w - s.top().index;
}
ans = max(ans, (long long)length * temp_height);
}
}
}
printf("%lld\n", ans);
num = a = length = temp_height = temp_w = 0;
ans = 0;
while (!s.empty()) s.pop();
}
return 0;
}