广告印刷
【题目描述】
广告牌是刷在城市的建筑物上的,城市里有紧靠着的N个建筑。
小明决定在上面找一块尽可能大的矩形放置广告牌。我们假设每个建筑物都有一个高度,
从左到右给出每个建筑物的高度H1、H2······HN,且0 < Hi <= 1000000000,并且我们假设每个建筑物的宽度均为1。
要求输出广告牌的最大面积。
【输入文件】
第一行是一个数n (n <= 400000);
第二行是n个数,分别表示每个建筑物高度H1、H2······HN,且0 < Hi <= 1000000000。
【输出文件】
一行,表示广告牌的最大面积。
【输入样例】
6
5 8 4 4 8 4
【输出样例】
24
源代码: #include<cstdio> int 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<tail&&h[a]<=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<tail&&h[a]<=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; }