开学第十一周.one(单调队列)

 许多科目已经接近尾声,其中我选修的书法学也已经结课,昨晚刚考完试,这样的话每周又多出两节自习,真好。回想昨晚的考试真是令人哭笑不得,一个书法学选修课竟然闭卷而且还监考的比较严,我的准备都泡汤了,但是也很奇妙,感谢书法课考试给我看答案的那位女同学。

今天又测了1500,我去,跑的我真难受,还是对锻炼身体不重视,才导致如此吃力。身体是革命的本钱,好好爱护自己,每天给身体充能——补充营养,经常锻炼。

时间愈来愈紧了,我也准备开始部分学科的复习,这样做题的时间可能会少点,没办法呀,只能自己掂量着挤挤时间喽。话说回来,我感觉自己组织语言的能力好像下降了许多,好像很长时间没有看书了,每天做题做不下去的时候就看看书放松一下吧,自己也别太累,也别太心急,知识是逐渐积累的,并不是一撮而就的,给自己足够多的消化时间,另外,摆正对“难题”的心态,毕竟也是提升自己最快的方式。//forever youthful,forever weeping.

单调队列

单调队列是种特殊双端队列,其内部元素具有单调性。最常用的是最大队列与最小队列,其内部元素分别单增或单减。
有如下操作:
(1)插入:若新元素从队尾插入会破坏单调性,则删除队尾元素,直到不在破坏单调性为止,再将其加入单调队列尾。
(2)获取最优(max,min)值:访问队首元素。
 

单调队列的性质:获取问题要求某种元素的最值,并且在进行时被弹出的元素(删除)并不影响问题的求解。

先构建一个单调数组(单增或单减)一般保存数组下标

模板:

 PUSH

  const int MAX=1e6+10;
  int rise[MAX];int reduce[MAX];//单调队列
  int ans[MAX];//数据数组
  int head=1,tail=0;//头尾,指针
  for(int i=1;i<=n;++i)//遍历整个数组
    {
        while(head<=tail&&ans[reduce[tail]]>=ans[i]) tail--;//单减队列
        reduce[++tail]=i;//入队
        判断头指针是否符合条件,不符合  ++head
    }




     for(int i=1;i<=n;++i)
    {
        while(head<=tail&&ans[rise[tail]]<=ans[i]) tail--;//单调递增队列
        rise[++tail]=i;//入队
        判断头指针是否符合条件,不符合 ++head
    }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值