题意
给出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; }