zoukankan      html  css  js  c++  java
  • poj2559单调栈

    给一系列并排的矩形,宽都是1,长不同,求最大的矩形(可被上述矩形覆盖)的面积

    单调栈,栈中元素为每个值所在的位置,记录下从每个值大于当前值所能到达最远的左边和右边的距离,此时中间的值一定是最小,然后H*(R-L)即当前点所能覆盖的最大面积

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=100000+10,maxn=5000+10,inf=0x3f3f3f3f;
    
    ll q[N],a[N],l[N],r[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        while(cin>>n,n){
            ll t=0;
            for(int i=0;i<n;i++)cin>>a[i];
            for(int i=0;i<n;i++)
            {
                while(t>0&&a[i]<=a[q[t-1]])t--;
                if(t>0)l[i]=q[t-1]+1;
                else l[i]=0;
                q[t++]=i;
            }
            t=0;
            for(int i=n-1;i>=0;i--)
            {
                while(t>0&&a[i]<=a[q[t-1]])t--;
                if(t>0)r[i]=q[t-1];
                else r[i]=n;
                q[t++]=i;
     //           cout<<r[i]<<endl;
            }
            ll ans=0;
            for(int i=0;i<n;i++)
                ans=max(ans,a[i]*(r[i]-l[i]));
            cout<<ans<<endl;
          //  cout<<ans<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    UI Automator Viewer工具的使用
    SQL数据库面试50题(转载)
    Python +selenium+pycharm(Windows)
    python安装及环境变量配置(Windows)
    JDK的安装与环境变量配置
    shell参数
    文件添加行号
    CentOS 7修改UTC为CST
    shell控制超时
    fio笔记
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7157747.html
Copyright © 2011-2022 走看看