我不懂单调栈取元素只要O(1)
  • 板块灌水区
  • 楼主Zhang_Wenjie
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/12/8 00:10
  • 上次更新2023/10/27 00:09:58
查看原帖
我不懂单调栈取元素只要O(1)
481621
Zhang_Wenjie楼主2022/12/8 00:10

就是 直方图 这题,我听的y总的讲解,代码如下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,h[N],l[N],r[N],s[N],t;
int main()
{
    while(cin>>n,n)
    {
        for(int i=1;i<=n;i++) cin>>h[i];
        h[0]=h[n+1]=-1;
        t=0;
        s[t]=0;
        for(int i=1;i<=n;i++)
        {
            while(h[s[t]]>=h[i]) t--;
            l[i]=s[t];
            s[++t]=i;
        }
        t=0;
        s[t]=n+1;
        for(int i=n;i>=1;i--)
        {
            while(h[s[t]]>=h[i]) t--;
            r[i]=s[t];
            s[++t]=i;
        }
        ll ans=0;
        for(int i=1;i<=n;i++)
            ans=max(ans,(ll)h[i]*(r[i]-l[i]-1));
        cout<<ans<<endl;
    }
    return 0;
}

单调栈以 O(1)O(1) 的时间取元素应该是指l[i]=s[t]r[i]=s[t]

while语句,为什么没算它的复杂度呢?

2022/12/8 00:10
加载中...