码迷,mamicode.com
首页 > 其他好文 > 详细

单调队列与单调栈作用

时间:2017-10-02 17:18:55      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:不能   最大值   color   序号   name   amp   pac   停止   turn   

单调栈解决的是以某个值为最小(最大)值的最大区间,实现方法是:求最小值(最大值)的最大区间,维护一个递增(递减)的栈,当遇到一个比栈顶小的值的时候开始弹栈,弹栈停止的位置到这个值的区间即为此值左边的最大区间;同时,当一个值被弹掉的时候也就意味着比它更小(更大)的值来了,也可以计算被弹掉的值得右边的最大区间。

该代码求以给出的每个值最小(最大)值的最大区间的左右端点。(该区间的每个数严格小于它)

#include<iostream>
#include<cstdio>
using namespace std;
const int INF=2147483647,maxn=10000;
int a[maxn+2],top=0,st[maxn+2],l[maxn+2],r[maxn+2],n;
int main() 
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    a[n+1]=INF-1;a[0]=INF;st[++top]=0;
    for(int i=1;i<=n+1;i++) 
    {
        while(a[i]>a[st[top]])
        {
            l[st[top]]=st[top-1]+1;r[st[top]]=i-1;
            top--;
        }
        st[++top]=i;
    }
    for(int i=1;i<=n;i++)printf("%d %d\n",l[i],r[i]);
    return 0;
}

    单调队列解决的是区间最小(最大)值,实现方法是:求区间最小(最大)值,就维护一个递增的双端队列,队中保存原始序列的标号,当即将入队的元素的值比队尾的元素的值小(大)的时候就不断弹掉队尾,知道出现比它更小的值,当即将入队的元素队首元素的跨度(即将入队元素的序号到队首元素序列的区间)大于规定区间时就不断弹掉队首,直到跨度小于或等于所规定的区间。如此可保证队首元素为最小(最大)值,(但不能保证队尾就是原始序列中的最大(最小)值),并维护区间长度。

单调队列与单调栈作用

标签:不能   最大值   color   序号   name   amp   pac   停止   turn   

原文地址:http://www.cnblogs.com/lher/p/7620330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!