单调栈

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

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

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\n",ans);
        memset(height,0,sizeof(height));
        memset(width,0,sizeof(width));
        top=0;
        ans=0;
    }
    return 0;
} 
View Code

 

posted @ 2019-09-27 22:00  Young-children  阅读(141)  评论(0编辑  收藏  举报