Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|
58202 | ExuallauxE | 最大的矩形纸片 | C++ | 通过 | 1 MS | 284 KB | 730 | 2024-12-05 12:46:06 |
#include<bits/stdc++.h> using namespace std; /* s[i]:以h[i]为高度的最大矩形 s[i]=(rt[i]-lt[i]-1)*h[i] rt[i]:矩形i右侧高度<h[i]的第一个矩形的下标 lt[i]:矩形i左侧... 方法:单调栈 */ const int N = 1e6 + 10; int n,lt[N],rt[N],h[N],st[N]; long long maxx; int main(){ cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&h[i]); } int top=0; for(int i=1;i<=n;i++){ while(top>0 && h[st[top]]>h[i]){ //踢出左侧高于自己的 rt[st[top]]=i , top--; } lt[i]=st[top]; //接收左侧低于自己的 ++top,st[top]=i; } while(top>0){ rt[st[top]]=n+1,top--; } for(int i=1;i<=n;i++){ maxx=max(1LL*h[i]*(rt[i]-lt[i]-1),maxx); } cout<<maxx; return 0; }