https://ac.nowcoder.com/acm/problem/50965
这是一道在直方图中寻找最大子矩形的题目,我们可以通过将单个矩形左右延伸来计算最大值
需要注意的是,这里的数据范围是1e9,所以我们要用long long定义相关变量,否则范围不够
由于数据较多并且大,推荐使用scanf来读取

#include <bits/stdc++.h>
using namespace std;
const int m=1e5+5;
struct node{
    int left,right;//左右边界
    long long height;//高度
}h[m];
long long ma=-1;
int main(){
    int n;
    while(scanf("%d",&n)&&n){
        ma=-1e9;
        for(int i=1;i<=n;i++){
            scanf("%lld",&h[i].height);
            h[i].left=h[i].right=i;//初始化的左右范围都是自己
        }
        h[0].height=-1e9;//为了让边界比较
        h[n+1].height=-1e9;
        for(int i=1;i<=n;i++){
            while(h[i].height<=h[h[i].left-1].height) h[i].left=h[h[i].left-1].left;//更新每个矩形左边边界的值
        }
        for(int i=n;i>=1;i--){
            while(h[i].height<=h[h[i].right+1].height) h[i].right=h[h[i].right+1].right;//更新每个矩形右边边界的值
        }
        for(int i=1;i<=n;i++){//计算最大值
            long long tmp=(h[i].right-h[i].left+1)*h[i].height;
            if(tmp>ma) ma=tmp;
        }
        printf("%lld\n",ma);
    }
    return 0;
}