原题链接
思路:
用单调栈维护每个数作为最小值可以向左和向右扩展到的最大区间,假设可以扩展到
,那么对于长度
的区间,
都可以作为答案,取最大值就可以。
代码:
const int maxn=2e5+7;
stack<PII>stk;
int ans[maxn],n,l[maxn],r[maxn],a[maxn];
int main(){
n=read;
rep(i,1,n) a[i]=read;
rep(i,1,n){
while(!stk.empty()&&stk.top().first>=a[i]){
stk.pop();
}
if(!stk.empty()) l[i]=stk.top().second+1;
else l[i]=1;
stk.push({a[i],i});
}
while(!stk.empty()) stk.pop();
per(i,n,1){
while(!stk.empty()&&stk.top().first>=a[i]) stk.pop();
if(!stk.empty()) r[i]=stk.top().second-1;
else r[i]=n;
stk.push({a[i],i});
}
rep(i,1,n) ans[r[i]-l[i]+1]=max(ans[r[i]-l[i]+1],a[i]);
per(i,n-1,1) ans[i]=max(ans[i],ans[i+1]);
rep(i,1,n) cout<<ans[i]<<" ";
return 0;
}