【题目描述】
广告牌是刷在城市的建筑物上的,城市里有紧靠着的N个建筑。小明决定在上面找一块尽可能大的矩形放置广告牌。我们假设每个建筑物都有一个高度,从左到右给出每个建筑物的高度H1、H2······HN,且0 < Hi <= 1000000000,并且我们假设每个建筑物的宽度均为1。要求输出广告牌的最大面积。
【输入文件】
第一行是一个数n (n <= 400000);第二行是n个数,分别表示每个建筑物高度H1、H2······HN,且0 < Hi <= 1000000000。【输出文件】一行,表示广告牌的最大面积。【输入样例】65 8 4 4 8 4【输出样例】24
源代码:#includeint n,h[400001],Q[400001];long long Left[400001],Right[400001];void Read(int &t){ char T=getchar(); while (T<'0'||T>'9') T=getchar(); while (T>='0'&&T<='9') { t=t*10+T-'0'; T=getchar(); }}void X_Left(){ Q[0]=0; int front=0,tail=1; for (int a=1;a<=n;a++) { while (front <=h[Q[tail-1]]) tail--; Left[a]=a-Q[tail-1]-1; Q[tail++]=a; }}void X_Right(){ Q[0]=n+1; int front=0,tail=1; for (int a=n;a>=1;a--) { while (front <=h[Q[tail-1]]) tail--; Right[a]=Q[tail-1]-a-1; Q[tail++]=a; }}long long Max_Area(){ long long Max=-1; for (int a=1;a<=n;a++) { long long Area=(Left[a]+Right[a]+1)*h[a]; if (Area>Max) Max=Area; } return Max;}int main(){ Read(n); for (int a=1;a<=n;a++) Read(h[a]); h[0]=h[n+1]=-1; X_Left(); X_Right(); printf("%lld",Max_Area()); return 0;}