题意:求最大的矩形
思路:枚举以每个矩形为左边界右侧最多延伸到哪里。不过会出现以某个矩形为左边界,但是高度小于这个矩形高度的情况,所以我们要 在入栈时进行矩形的合并操作。
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 100005;
int top;
struct pii{
LL w,h;
pii( LL _w = 0,LL _h = 0 ){
w = _w;h = _h;
}
}st[maxn];
int main(){
int n;
while(1){
scanf("%d",&n);
if(!n) break;
top = 0;
LL x;
LL ans = 0;
for( int i = 1;i <= n;i++ ){
scanf("%lld",&x);
LL w = 0;
while(top && st[top].h >= x ){
w += st[top].w;
ans = max( ans,st[top].h*w );
top--;
}
st[++top] = pii( w+1,x );
}
LL w = 0;
while(top){
w += st[top].w;
ans = max( ans,st[top].h*w );
top--;
}
printf("%lld\n",ans);
}
return 0;
}