学习笔记:单调队列

转自: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); 

递增的做相应的修改即可

总结:

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

时间: 2024-12-17 04:40:33

学习笔记:单调队列的相关文章

学习笔记::单调栈

单调栈和单调队列长得不是很像. 单调栈的用处是求以一个元素为中心,向两边最多拓展多远距离. 两个小时就没了... poj2796 #include<cstdio> using namespace std; typedef long long ll; #define N 200010 struct data { ll v,sum,l,r; }x[N],st[N],ans; ll n; inline void read(ll&a) { ll x=0,f=1; char c=getchar(

FreeRTOS学习笔记7-FreeRTOS 队列相关

在实际的应用中,常会遇到一个任务或者断服需要和另外进 在实际的应用中,常会遇到一个任务或者断服需要和另外进 行"沟通交流", 行"沟通交流", 行"沟通交流", 这个"沟通交流"的过程其实就是消息传递 这个"沟通交流"的过程其实就是消息传递 这个"沟通交流"的过程其实就是消息传递 这个"沟通交流"的过程其实就是消息传递 的过程.在 的过程.在 没有操作系统的时候两个应

RHCA学习笔记:RH442-Unit5 队列原理

NIT 5 Queuing Theory 队列原理 目标: 1.明白性能调优的关键术语 2. 应用队列技术解决性能问题 3.明白性能调优的复杂性 5.1    Introduction to queuing theory 队列原理简介 A.      Little’s Law 给出了队列原理的基础 John Little于1961年用数学证明了这个原理. B.      带来的好处: a.       可以用工程学方法来进行性能管理. b.       量化系统未来的性能 c.       说明

队列学习笔记 顺序队列

//顺序队列操作 #define QUEUEMAX 15 typedef struct  { DATA data[QUEUEMAX]; // 队列数组  int head;   //队头  int tail;   // 队尾   } SeqQueue; SeqQueue *SeqQueueInit() { SeqQueue *q; if(q=(SeqQueue *)malloc(sizeof)(SeqQueue))   // 申请保存队列的内存  { q->head = 0;  // 设置队头 

队列学习笔记 循环队列

 //循环队列 //CycQueue.h #define QUEUEMAX 15 typedef struct  { DATA data[QUEUEMAX];  //队列数组  int head; //队头  int tail; //队尾  }CycQueue; CycQueue *CycQueueInit () { CycQueue *q; if(q=(CycQueue *)malloc(sizeof(CycQueue))) //申请保存队列的内存  { q->head = 0;  //设置队

10.swoole学习笔记--进程队列通信

<?php //进程仓库 $workers=[]; //最大进程数 $worker_num=2; //批量创建进程 for($i=0;$i<$worker_num;$i++){ //创建子进程 $process=new swoole_process("doProcess",false,false); //开启队列--类似于全局函数 $process->useQueue(); //启动进程并获取进程id $pid=$process->start(); //存入进程

python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)

1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦    2)提高效率 class queue.Queue(maxsize=0)                        #先入先出class queue.LifoQueue(maxsize=0)                  #后进先出 class queue.PriorityQueue(maxsize=0)         

【算法学习笔记】53.单调队列的简单应用 SJTU OJ 1034 二哥的金链

1034. 二哥的金链 Description 一个阳光明媚的周末,二哥出去游山玩水,然而粗心的二哥在路上把钱包弄丢了.傍晚时分二哥来到了一家小旅店,他翻便全身的口袋也没翻着多少钱,而他身上唯一值钱的就是一条漂亮的金链.这条金链散发着奇异的光泽,据说戴上它能保佑考试门门不挂,RP++.好心的老板很同情二哥的遭遇,同意二哥用这条金链来结帐.虽然二哥很舍不得这条金链,但是他必须用它来付一晚上的房钱了. 金链是环状的,一共有 N 节,老板的要价是 K 节.随便取下其中 K 节自然没问题,然而金链上每一

【笔记篇】单调队列优化dp学习笔记&amp;&amp;luogu2569_bzoj1855股票交♂易

DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而且有各种各样的类型 优化之类的. 一直dp都不怎么好. 而且也不太知道应该怎么提高. 基本见到不认识的dp方程就不大会推(但我会打表啊= = 所以dp还是很有的学的~ 正好最近刚刚肝了计算几何, 所以就顺带搞一下斜率优化dp一类的... 单调队列优化dp 单调队列大家都会吧? 不会的先出去学一下,