题目链接
题意:给定一个数组,要你选连续x个数的最大值是多少?(一个数组的最大值定义为这个数组的元素的最小值)。
思路:我们可以用单调栈来维护每个元素的连续区间长度,那么我们先考虑每个数前面的,如果栈内元素是1 2 5 6,现在的元素是4,那么很明显5和6都要被弹出去,那么这个时候包含了5和6这两个元素的区间长度他们的最小值是不是都可以变为4了呀,如果5的连续区间是1,6的连续区间是2,那么长度为1的和长度区间为3的最小值是不是就可以更新为4了?我们就这样依次动态更新,不过再最后的时候我们要多加一个尾元素0,如果不加的话会产生什么后果呢?就是会更新不到后面的情况,我们刚刚做的都是当前这个数左侧的情况,这个数右侧的情况会忽略。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
stack<pair<int,int>>s;//first存下标,second存连续区间长度
int n,a[maxn],ans[maxn]={0},minn=1e9+1,maxx=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),minn=min(minn,a[i]),maxx=max(maxx,a[i]);
a[++n]=0;
for(int i=1;i<=n;++i)
{
int len=0;
while(!s.empty()&&a[s.top().first]>=a[i])
{
ans[len+s.top().second]=max(ans[len+s.top().second],a[s.top().first]);
len+=s.top().second;
s.pop();
}
s.push({i,len+1});
}
for(int i=n-1;i>=1;--i)
ans[i]=max(ans[i],ans[i+1]);
for(int i=1;i<n;++i) printf("%d ",ans[i]);
}