美文网首页DataStructure
POJ-2796(单调栈)

POJ-2796(单调栈)

作者: 雨落八千里 | 来源:发表于2019-06-10 19:44 被阅读0次

单调栈的运用:

一系列数中取一个子序列使得子序列和乘以子序列中的最小值使得这个值最大。

思想:

要保证自己是一段区间的最小值,如何保证自己是区间的最小值呢?
找出比自己小的数,不加入区间,自己就不是最小的了.....
从当前数向左遍历找出比自己小的第一个数的下标l,从当前的数向右遍历,找出比自己小的第一个数的下标r,那么区间[l+1,r-1]就可以保证当前的数是最小的啦!!!!

Feel Good

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
#define ll long long
using namespace std;
int R[101000],L[101000];
int a[101000];
ll sum[101000];
stack<int>s;
int main( )
{
      int n;
      scanf("%d",&n);
      for(int i=1;i<=n;i++)
      {
            scanf("%d",&a[i]);
            if(i==1)
            {
                  sum[1]=a[1];
            }
            else
            {
                  sum[i]=sum[i-1]+a[i];
            }

      }
      for(int i=1;i<=n;i++)
      {
            while(!s.empty( )&&a[s.top( )]>=a[i])//找出每个数向左遍历比自己小的第一个数
            {
                  s.pop( );
            }
            if(s.empty( ))
            {
                  L[i]=0;
            }
            else
            {
                  L[i]=s.top( );
            }
            s.push(i);
      }
      /*for(int i=1;i<=n;i++)
      {
            cout<<L[i]<<" ";
      }
      cout<<endl;*/
      while(!s.empty( ))
      {
            s.pop( );
      }
      for(int i=n;i>0;i--)
      {
            while(!s.empty( )&&a[s.top( )]>=a[i])//找出每个数向右遍历比自己小的第一个数
            {
                  s.pop( );
            }
            if(s.empty( ))
            {
                  R[i]=n+1;
            }
            else
            {
                  R[i]=s.top( );
            }
            s.push(i);
      }
      /*for(int i=1;i<=n;i++)
      {
            cout<<R[i]<<" ";
      }
      cout<<endl;*/
      ll ans=-1;
      int left=1;
      int right=1;
      for(int i=1;i<=n;i++)
      {
            if(ans<(sum[R[i]-1]-sum[L[i]])*a[i])
            {
                  ans=(sum[R[i]-1]-sum[L[i]])*a[i];
                  left=L[i]+1;
                  right=R[i]-1;
            }
      }
      printf("%lld\n",ans);
      printf("%d %d\n",left,right);
      return 0;
}

相关文章

  • POJ-2796(单调栈)

    单调栈的运用:一系列数中取一个子序列使得子序列和乘以子序列中的最小值使得这个值最大。思想:要保证自己是一段区间的最...

  • 单调栈和应用实践

    什么是单调栈 单调栈的定义:单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。 如何使用单调栈 单调...

  • 1.单调栈

    一、单调栈定义 单调栈(monotone-stack)是指栈内元素(栈底到栈顶)都是(严格)单调递增或者单调递减的...

  • 单调栈 2020-06-12(未经允许,禁止转载)

    1.单调栈 指栈内元素保持单调性的栈结构,分为单调增栈(栈底到栈顶元素递增)和单调减栈(栈底到栈顶元素递减) 2....

  • LeetCode刷题指北----单调栈

    1.什么是单调栈?有什么好处? 定义: 单调栈就是栈内元素递增或者单调递减的栈,并且只能在栈顶操作。单调栈的维护是...

  • C语言之单调栈

    单调栈 What 单调栈也是栈的一种,满足先进后出的原则,另外,单调栈中的元素是有序的,分为两种 单调递增栈:单调...

  • 腾讯笔试--逛街

    主要的知识点是:单调栈,该题牢牢记得:栈中记录当前楼能看到的元素 单调栈是单调递增栈,栈顶是最小值单调栈存的是能看...

  • 题解——单调栈

    单调栈题解 单调栈结构 牛客链接 方法:单调栈 算法 这里维护一个单调递增栈,可以找到比当前元素要小的元约定:当前...

  • 单调栈

    leetcode - 42. 接雨水单调栈即元素严格单调递增或单调递减的栈,只需要在元素入栈的时候保持栈的单调性即...

  • Java版算法模版总结(2)

    本次233酱介绍下单调栈、单调队列、并查集、KMP算法,欢迎交流指正~ 单调栈 「单调栈」首先是一种基于栈的数据结...

网友评论

    本文标题:POJ-2796(单调栈)

    本文链接:https://www.haomeiwen.com/subject/zeptfctx.html