跳转至

单调队列

模版
C++
// 求 [i-m+1, i] 的最值
deque<int> que;
for (int i = 1 ; i <= n ; i++) {
    while (!que.empty() && a[que.back()] >= a[i]) que.pop_back();
    que.emplace_back(i);
    while (que.front() <= i - m) que.pop_front();
    if (i >= m) mi.emplace_back(a[que.front()]);
}
for (int i = 0 ; i < n - m + 1 ; i++) cout << mi[i] << " \n"[i == n - m];
deque<int>().swap(que);
for (int i = 1 ; i <= n ; i++) {
    while (!que.empty() && a[que.back()] <= a[i]) que.pop_back();
    que.emplace_back(i);
    while (que.front() <= i - m) que.pop_front();
    if (i >= m) mx.emplace_back(a[que.front()]);
}
for (int i = 0 ; i < n - m + 1 ; i++) cout << mx[i] << " \n"[i == n - m];
例题