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 @   拍手称快  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示