Largest Rectangle in a Histogram
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13037 Accepted Submission(s): 3680

Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.
题意:求木板连在一起的最大矩形面积
分析:一个木板左边连续比他高的最后一块木板的坐标为l[i],右边连续比他高的最后一块木板的坐标为r[i],面积则为(r[i]-l[i]+1)*a[i],但按原始的思路会超时,需要一些优化,把一些坐标存起来,具体操作看代码
代码:
#include "stack"
#include "stdio.h"
#include "iostream"
#include "math.h"
#include "string.h"
#include "algorithm"
#include "queue"
#define LL long long
#define pi 3.1415926535897932384626433832795028841971
using namespace std;
int i,j,r[100005],l[100005],n,k;
LL a[100005],mas;
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
l[1]=1;
for(i=2;i<=n;i++)
{
k=i;
while(k>1&&a[i]<=a[k-1])
k=l[k-1];
l[i]=k;
}
r[n]=n;
for(i=n-1;i>=1;i--)
{
k=i;
while(k<n&&a[i]<=a[k+1])
k=r[k+1];
r[i]=k;
}
mas=-1;
for(i=1;i<=n;i++)
{
if((r[i]-l[i]+1)*a[i]>mas)
mas=(r[i]-l[i]+1)*a[i];
}
printf("%lld\n",mas);
}
return 0;
}
浙公网安备 33010602011771号