参考洛谷p1440求m区间内的最小值、洛谷p1725琪露诺
1.单调队列:p1440求m区间内的最小值(滑动窗口)
对于一组数据,多次求一个区间内的最值,可以用一个双端队列deque维护,
struct node
{
int val;//要比较的值
int pos;//这个值在这组数据中的位置
}v[N];
min_que[0] = 0;
int head = 1,tail = 0;
for(int i = 1; i < n; i++){
while((head <= tail)&&(v[tail].val >= a[i - 1]))
tail--;//tail移动到从尾端数第一个小于该数的位置
v[++tail].val = a[i - 1];
v[tail].pos = i - 1;//将该数据放到队列中
while((head <= tail)&&(v[head].pos < i - m))
head++;//将不在这个区间内的头部去掉,
//中间的暂时不用去掉,因为只会用到头部
min_que[i] = v[head].val;
}
2.单调队列优化dp:
有一种dp要寻找从 i 到 j 中最大的 dp[k] ,此时可以利用单调队列来优化