C++版本:
单调递增单调队列
void min_monotonic_queue() {//单调递增(维护最小值)
int head = 1, till = 0;//队列头尾下标(指针)
int que[maxn], p[maxn];//que队列 p标记入队时间
for (int i = 1; i <= n; i++) {
//弹出比当前值要差的元素(维护单调性)
while (head <= till && que[till] >= a[i])till--;
que[++till] = a[i];//新元素入队
p[till] = i;//标记新元素入队时间
while (p[head] <= i - k)head++;//丢弃过期元素
}
}
单调递减单调队列
void max_monotonic_queue() {//单调递减(维护最大值)
int head = 1, till = 0;//队列头尾下标(指针)
int que[maxn], p[maxn];//que队列 p标记入队时间
for (int i = 1; i <= n; i++) {
//弹出比当前值要差的元素(维护单调性)
while (head <= till && que[till] <= a[i])till--;
que[++till] = a[i];//新元素入队
p[till] = i;//标记新元素入队时间
while (p[head] <= i - k)head++;//丢弃过期元素
}
}