ABC359
E
题目很简单,大概就是要求数组中一个数的左侧第一个比它大的值。这里就需要用单调栈来实现了。
单调栈
单调栈就是通过栈的性质,来实现快速查找一个数的左侧第一个比他大的数。
- 过程
创建一个栈,判断栈顶元素是否小于当前元素,如果小于则将栈顶元素弹出直到栈顶元素大于当前元素,最后将当前元素压入栈。 - 原理
因为对所有的值的处理只会有判断和弹出,元素不会被重复遍历。所以可以实现O(n)的时间复杂度。
代码实现
void solve()
{
i64 n;
std::cin>>n;
std::vector<i64>a(n+1),ans(n+1);
for(int i=0;i<n;i++){
std::cin>>a[i];
}
std::stack<i64>st;
ans[0]=a[0];
i64 maxn=a[0];
i64 num=0;
st.push(0);
for(int i=1;i<n;i++){
while(!st.empty()&&a[st.top()]<a[i]){//这里就是单调栈的实现,由于题目需求,这里栈压入的是数组元素的下标
st.pop();
}
if(!st.empty()){
ans[i]=(i-st.top())*a[i]+ans[st.top()];
}else{
ans[i]=(i+1)*a[i];
}
st.push(i);
}
for(int i=0;i<n;i++){
std::cout<<ans[i]+1<<" ";
}
std::cout<<"\n";
}