zoukankan      html  css  js  c++  java
  • 单调栈

    组长大大辛辛苦苦整理的周任务,当然要好好完成啦。比较喜欢单调栈详解的博客,嘿嘿嘿。

    相关博客收藏:单调栈原理及应用 详解 附各种类型的题目练习

    std::stack 基本操作

    个人理解:

    单调栈简单来说就是根据栈的特点,保持栈内单调递增或递减。(栈:后进先出(LIFO-last in first out):最后插入的元素最先出来。  队列:先进先出(FIFO-first in first out):最先插入的元素最先出来。)

    例如:实现一个单调递增的栈,比如现在有一组数10,3,7,4,12。从左到右依次入栈,则如果栈为空或入栈元素值小于栈顶元素值,则入栈;否则,如果入栈则会破坏栈的单调性,则需要把比入栈元素小的元素全部出栈。单调递减的栈反之。

    模板题:

    简单理解之后,写了一个模板题,下面是通过的代码(大佬帮忙改bug的时候,表示这个板子太复杂了,心塞塞,继续加油啦!!!)

    POJ 2559

    多组样例,每组 n n个数据 最后一个输入0。结束
    1<=n<= 100000
    Sample Input

    7 2 1 4 5 1 3 3
    4 1000 1000 1000 1000
    0
    Sample Output

    8
    4000

    数据规模与约定

    时间限制:1s1s

    空间限制:64MB
    */

    #include <iostream>
    #include <stack>
    #include <string.h>
    #include <stdio.h>
    using namespace std;
    int  n,height[100080]={},width[100080]={},top=0;
    long long ans=0;
    int main()
    {
        stack<int> mystack;
        while(cin>>n&&n!=0)
        {
            for(int i=1;i<=n;i++) scanf("%d",&height[i]);
            height[n+1]=0;
            while(!mystack.empty())
            {
                mystack.pop(); 
            } //先清空栈
            for(int i=1;i<=n+1;i++)
            {
                if(mystack.empty()||mystack.top()<=height[i]) 
                {
                    mystack.push(height[i]);
                    width[++top]=1;
                }
                else 
                {
                    int Widthsum=0;
                    while(!mystack.empty()&&mystack.top()>height[i]/*栈非空并且栈顶元素大于等于入栈元素*/)
                    {
                        Widthsum+=width[top];
                        ans=max(ans,(long long)Widthsum*mystack.top());
                        mystack.pop();
                        top--;
                        //栈顶元素出栈;
                        //更新结果; 
                    } 
                    mystack.push(height[i]);
                    width[++top]=Widthsum+1;
                }      
            }
            printf("%lld
    ",ans);
            memset(height,0,sizeof(height));
            memset(width,0,sizeof(width));
            top=0;
            ans=0;
        }
        return 0;
    } 
    View Code
  • 相关阅读:
    爬弹幕
    写了这么多行就给我30,呜呜呜
    ticket
    yield求平均数
    协程原理
    爬取一类字二类字的信息和笔顺gif图片
    关于CRF的相关阅读
    embedding size与vocabulary size之间的关系: e = v**0.25
    pandas多个值取数
    转 pandas pivot
  • 原文地址:https://www.cnblogs.com/young-children/p/11600703.html
Copyright © 2011-2022 走看看