求每个固定长度区间最值
顾名思义,单调队列即是一个单调的队列.
这里只考虑求区间最小值.
建立一个单调递增的队列,队首是最小值.
开始队列为空,每次添元素的时候,从队尾向前比较,
直到找到最靠前的比自己小的数,将待添加元素添加到这个数后面,
舍弃后面的所以数.(这是因为新添加的数一定比后面的数更优)
每次取最小值时,因为区间左端点在变,
故对于队列中的每一个元素,记录它在原数列中的位置.
当当前所求区间中不含队首元素时,将队首舍弃.
直到队首在所求区间时,输出队首即可.
由于每个元素最多进出队一次,故复杂度为O(n).
struct dddl{ int queue[maxn],t[maxn],tou,wei,ji; void csh(){tou=wei=0;} void push(int e,int tim){//添加的数为e,其在原数列中的位置为tim. 单增:if(ji==0)while(tou<wei&&queue[wei-1]>=e)wei--; 单减:if(ji==1)while(tou<wei&&queue[wei-1]<=e)wei--; wei++;queue[wei-1]=e;t[wei-1]=tim; } int gettop(int tim){//tim为目前区间所含有的下标最小的数的下标. while(t[tou]<tim)tou++; return queue[tou]; } }que;