zoukankan      html  css  js  c++  java
  • poj3250(单调栈模板题)

    题目链接:https://vjudge.net/problem/POJ-3250

    题意:求序列中每个点右边第一个>=自身的点的下标。

    思路:简单介绍单调栈,主要用来求向左/右第一个小于/大于自身的下标,直接求的话复杂度为O(n2),而单调栈只有O(n),利用好单调栈十分有用。一个元素向左遍历的第一个比它小的数的位置就是将它插入单调栈时栈顶元素的值,若栈为空,则说明不存在这么一个数。然后将此元素的下标存入栈,就能类似迭代般地求解后面的元素

      单调栈的本质是,当一个数a在另一个数b前面且比b大,那么数a就在找第一个比某数小的问题里就完全没有考虑的必要了,他被b完全屏蔽了。

      这道题就是单调栈的简单应用,模板题。注意结果用int存不下,需要用long long。

    AC代码:

    #include<cstdio>
    using namespace std;
    
    int n,a[80005],stk[80005],p;
    long long ans;
    
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            scanf("%d",&a[i]);
        a[n+1]=0x3f3f3f3f;
        stk[p++]=n+1;
        for(int i=n;i>=1;--i){
            while(a[stk[p-1]]<a[i]) --p;
            ans+=stk[p-1]-i-1;
            stk[p++]=i;
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    之前的博客
    用struts2 s2-045漏洞拿站记录
    修改BlackLowKey皮肤样式,增加占屏比
    SpringBoot自动配置原理
    CAS无锁技术
    CAS单点登录原理解析
    死锁与活锁的区别,死锁与饥饿的区别
    jvm问题
    jdk动态代理的实现原理
    抽象工厂
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/10784015.html
Copyright © 2011-2022 走看看