2018级SDUTACM集训队第二次选拔赛 G - 完美矩阵

p.s. 单调栈应用

完美矩阵

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

给你n个连续的宽为1的长方形,高为a[i]。
完美矩形指的就是:所给图形里面包含最大面积的矩形。
输出完美矩形的面积。

2018级SDUTACM集训队第二次选拔赛 G - 完美矩阵_第1张图片

Input

第一行给你一个正整数 n(1<=n<=1e5),第二行给你 n 个正整数 a[i](1<=a[i]<=1e9),分别代表第 i 个长方形的高度。

Output

输出完美矩形的面积

Sample Input

7
2 1 4 5 1 3 3

Sample Output

8

题目链接:

http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2736/pid/4357

#include 

using namespace std;

int main()
{
    int n,l[100010],r[100010],s[100010],top=0;
    long long a[100010];
    cin >> n;
    for(int i=1;i<=n;i++)
    cin >> a[i];
    l[1]=0;
    top=0;
    for(int i=2;i<=n;i++)
    {
        if(a[i]>a[i-1])
        {
            l[i]=i-1;
            top++;
            s[top]=i-1;
        }
        else
        {
            while(top)
            {
                if(a[i]<=a[s[top]])
                top--;
                else
                {
                    l[i]=s[top];
                    break;
                }
            }
            if(!top)
            l[i]=0;
        }
    }
    r[n]=n+1;
    top=0;
    for(int i=n-1;i>=1;i--)
    {
        if(a[i]>a[i+1])
        {
            r[i]=i+1;
            top++;
            s[top]=i+1;
        }
        else
        {
            while(top)
            {
                if(a[i]<=a[s[top]])
                top--;
                else
                {
                    r[i]=s[top];
                    break;
                }
            }
            if(!top)
            r[i]=n+1;
        }
    }
    long long max=a[1]*(r[1]-l[1]-1);
    for(int i=2;i<=n;i++)
    {
        if(a[i]*(r[i]-l[i]-1)>max)
        max=a[i]*(r[i]-l[i]-1);
    }
    cout << max;
    return 0;
}

 

你可能感兴趣的:(2018级SDUTACM集训队第二次选拔赛 G - 完美矩阵)