题目大意:
如下图所示,在一条水平线上方有若干个矩形,求包含与这些矩形的并集内部的最大矩形的面积(在下图中,答案就是阴影部分的面积),矩形个数≤1055
解题思路:
单调栈
我们建立一个栈,用来保存若干个矩形,这些矩形的高度是单调递增的,我们从左到右依次扫描每个矩形: 如果当前矩形比栈顶高或者与栈顶相等,直接进栈。 否则不断去除栈顶,直至栈为空或站定举行高度比当前矩形矩形小,在出栈过程中,我们积累被弹出的矩形的宽度之和,并且每弹出一个矩形,就用它的高度乘上积累的宽度去更新答案。 整个出栈过程结束后,我们把一个高度为当前矩形高度、宽度计值的新矩形入栈。 整个扫描结束后,我们把栈中剩余的矩形依次弹出,按照与上面的相同方法更新答案。 或者增加一个高度为0的矩形a[n+1],以避免在扫描结束后栈中有剩余矩形Accepted code:
#include#include #include #include using namespace std; int n,w[100011],a[100011],A[100011]; int main(){ while(1) { scanf("%d",&n); if (n==0) return 0; long long maxn=0; int p=0; a[n+1]=0; for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n+1;i++) { if(a[i]>A[p]) { A[++p]=a[i];w[p]=1; } else { int len=0; while(A[p]>a[i]) { len+=w[p]; maxn=max(maxn,(long long)len*A[p--]); } A[++p]=a[i],w[p]=len+1; } } cout< <