传送门

题意

给出n个相邻的建筑,每个建筑有一定的高度,宽度均为1,计算存在的最大的矩形面积。

 

思路

每个建筑的高度都可以作为矩形的高,用l[i]和r[i]记录以第i个建筑为矩形的高所可以延伸至的最左端范围和最右端范围。

 

代码

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 100000 + 5;

int a[maxn], l[maxn], r[maxn];

struct node{
    int value, pos;
    bool operator < (const node& rhs) const{
        return value < rhs.value;
    }
};

int main(){
    //freopen("in.txt", "r", stdin);
    int n;
    while(~scanf("%d", &n)){
        for(int i=0; i<n; i++)  scanf("%d", &a[i]);

        priority_queue<node> q;
        for(int i=0; i<n; i++){
            while(!q.empty()){
                node s = q.top();
                if(s.value > a[i]){
                    r[s.pos] = i-1;
                    q.pop();
                }
                else if(s.value <= a[i]){
                    break;
                }
            }
            node s;
            s.value = a[i];
            s.pos = i;
            q.push(s);
        }
        while(!q.empty()){
            node s = q.top();
            q.pop();
            r[s.pos] = n-1;
        }

        for(int i=n-1; i>=0; i--){
            while(!q.empty()){
                node s = q.top();
                if(s.value > a[i]){
                    l[s.pos] = i+1;
                    q.pop();
                }
                else if(s.value <= a[i]){
                    break;
                }
            }
            node s;
            s.value = a[i];
            s.pos = i;
            q.push(s);
        }
        while(!q.empty()){
            node s = q.top();
            q.pop();
            l[s.pos] = 0;
        }

        int res = -1;
        for(int i=0; i<n; i++){
            res = max(res, a[i]*(r[i]-l[i]+1));
        }
        printf("%d\n", res);
    }
    return 0;
}