思路:
用单调栈维护每个数作为最小值可以向左和向右扩展到的最大区间,假设a i可以扩展到[ l , r ],那么对于长度1 < = l e n < = r − l + 1的区间,a i都可以作为答案,取最大值就可以。
代码:
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; }