Largest Rectangle in a Histogram
luogu-SP1805
poj 2559
题目大意:
有n个并排的矩阵,高度为aia_iai,宽度为1,现在让求包含于这些矩阵的并集内部的最大矩阵的面积
输入样例
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
输出样例
8
4000
数据范围
1⩽n⩽1000001\leqslant n\leqslant 1000001⩽n⩽100000
0⩽hi⩽10000000000\leqslant h_i\leqslant 10000000000⩽hi⩽1000000000
解题思路:
我们可以建立一个单调不下降的栈,然后遇到下降的矩阵时,就让前面的统计一遍,然后宽度累加到当前矩阵,然后重复这个操作
代码:
#include<cstdio>
#define max(a,b) (a)>(b)?(a):(b)
using namespace std;
int n;
long long x,num,top,ans,s[100500],w[100500];
int main()
{scanf("%d",&n);while(n){ans=0;for (int i=1;i<=n;++i){scanf("%lld",&x);num=0;while(s[top]>x)//高出部分{num+=w[top];//比他高的可以降低高度,然后一起计算ans=max(ans,num*s[top]);//计算结果top--;//出栈}s[++top]=x;//入栈w[top]=num+1;//宽度累加在当前矩阵,因为当前矩阵比他们都矮}num=0;while(top)//把剩下的也计算一遍{num+=w[top];ans=max(ans,num*s[top]);top--;}printf("%lld\n",ans);scanf("%d",&n);}
}