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