Q1:单调队列和普通队列有什么不同?
A1:单调队列中的数值是单调的,数值下标也是单调的;普通队列只能从队首出队,单调队列可从队首或队尾出队;入队时一次只入一个(普通队列一次可能入多个)
Q2:单调队列的出队和入队规则?
A2:(1)入队:入队前要确定自己能否入队,如果入队后改变了队列的单调性,那就需要先出队,直到保证自己入队后队列是单调的;入队的内容是数值和下标
(2)出队:a.从队首出(窗口满了,溢出);b.从队尾出(新插入的值改变了单调队列的属性)
Q3:单调队列有什么用途?
A3:(1)求解定长连续子序列的最值问题;(2)求定长子序列的最大和;(3)对定长滑动区间动态规划的优化
例:1597:【 例 1】滑动窗口
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int n , k , a[N];
int Fmin[N] , Fmax[N];
int q[N] , id[N];//q队列存数值,id队列存下标
int head , tail;
void DPmin();
void DPm