最大矩形面积
如果栈为空,或者新的元素是大于栈顶元素的,那么新来的元素不会破坏栈的单调性,那么就把这个柱子入栈。
特别注意:这里的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;
}