学习笔记:单调队列
来源:互联网 发布:java身份证号计算年龄 编辑:程序博客网 时间:2024/05/17 23:50
转自: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);
递增的做相应的修改即可
总结:
单调队列使用多变,在具体的题目中,应灵活运用~
0 0
- 学习笔记:单调队列
- 单调队列 学习笔记
- 单调队列学习笔记
- Algorithm学习笔记 --- 单调队列
- 学习笔记:复习单调队列
- [HAOI2007]理想正方形-单调队列学习笔记
- |算法讨论|单调队列 学习笔记
- 单调队列学习 PKU2823
- 单调队列学习
- 单调队列学习
- 单调队列学习小结
- 单调队列学习
- 单调队列的学习
- Algorithm学习笔记 --- Set Definition(单调队列)
- [HNOI2008]玩具装箱-DP斜率优化-单调队列-学习笔记
- 单调队列的学习 pku2823
- 单调栈 学习笔记
- 单调队列或单调栈的学习及认识
- python(2)
- 学习笔记:STL
- gson
- Android动态加载dex技术初探
- C++ 竞赛常用头文件
- 学习笔记:单调队列
- Thinking in Java(6)-private constructors
- 升级Xcode到8之后,一写代码就闪退的问题
- 学习笔记:状态压缩DP
- Java中等待所有线程都执行结束
- poj 2823 Sliding Window 题解
- 编程之美——中国象棋将帅问题
- 学习笔记:树状数组
- 设计模式(九):策略模式Strategy(行为型模式)