0
点赞
收藏
分享

微信扫一扫

CF547B Mike and Feet(单调栈)


​​原题链接​​

思路:

用单调栈维护每个数作为最小值可以向左和向右扩展到的最大区间,假设可以扩展到,那么对于长度的区间,都可以作为答案,取最大值就可以。

代码:

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;
}


举报

相关推荐

0 条评论