• 学习笔记:单调队列


    转自:http://apps.hi.baidu.com/share/detail/34010558

    【单调队列】在解一个序列某个区间段的最值问题,我们可以用到单调队列来解决。 
    比如poj2823 Sliding Window 就是一个很好的例子:给定一个序列,要求序列中固定长度为k 的区间中的最大值和最小值。 
    【原理】单调队列维护的是区间最值: 
    1、最大值的维护: 
            比如我们要维护一个区间为k的最大值的单调队列,由于新插入 的节点他的“生命力”肯定比原先已经在队列中的元素“活”的时间长,将插入元素不断与队尾元素比, 如果他大于队尾元素,那么r--将队尾元素删掉,(因为目前插入的这个元素值(设为pos)更大,而且“活”的时间 长,有pos在,队尾元素的有“生”之年永远都没法为最大值,故而直接无视比pos小的队尾了)。直到对空位置或者 找到了一个比pos大的队尾。 
    2、K区间的维护: 
            比如当前k区间的起点为i,即区间为[i,i+k-1],那么如果队头元素front的下标j<i,那么front便不符合 在当前k区间范围内,那么他的值便不属于当前k区间的最值,所以f++将对头出队。这段操作绝对不会遇到队 空的情况,应为第1步已经插入了一个在区间为[i,i+k-1]的元素pos,他下标j必然符合j>=i 


    【模板代码】

    1 struct nodes  
    2 { 
    3     int val,beg ; 
    4 }; 
    5 
    6 nodes qu1[N]; 
    7 int r1,f1 ; 

    递减队列:

     1 void insert(int m,int id,int L)//L为区间的最左下标,m要插入的值,id该值的下标 
     2 { 
     3     while(r1>=f1&&m>qu1[r1].val) 
     4      r1--; 
     5      qu1[++r1].val=m ; 
     6      qu1[r1].beg=id ; 
     7     while(qu1[f1].beg<L) 
     8      f1++; 
     9 } 
    10 
    11 //f>r qu empty 
    12 Init: f=r=0; 
    13 
    14 insert(a[i],i,L); 

    递增的做相应的修改即可


    总结:

    单调队列使用多变,在具体的题目中,应灵活运用~

  • 相关阅读:
    进入社会,我们要做哪些准备?
    2天玩转单反相机(第二讲)
    Google广告优化与工具
    Ext JS 4:模型剖析
    iphone开发教程(1) iOS大纲
    iPhone objectivec字符串类NSString的使用
    Ext JS 4倒计时:图形和图表
    Ext JS 4倒计时:开发者预览版
    WOSA介绍
    “苹果皮”与知识产权
  • 原文地址:https://www.cnblogs.com/SBSOI/p/5642920.html
Copyright © 2020-2023  润新知