ABC359

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";
}
posted @ 2024-06-25 20:18  拍手称快  阅读(2)  评论(0编辑  收藏  举报