广告印刷

【题目描述】
广告牌是刷在城市的建筑物上的,城市里有紧靠着的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;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5737846.html