TB椰程 TypeBuddy 打字搭子

双端队列与单调队列

CSP-J · 编程模板 · 片段 · cpp · 难度 4/5 · 共 527 字

双端队列维护滑动窗口最值(单调队列)

  • 数据结构
  • 单调队列

前置内容

正文

// 单调队列:滑动窗口最值
// 用双端队列维护单调下标
// 队首过界出队,破坏单调出队
// 例:长度 k 窗口最大值
#include <cstdio>
int a[100005], q[100005], hd = 1, tl = 0;
int n, k;
int main() {
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        // 队首超出窗口则出队
        while (hd <= tl && i - q[hd] >= k)
            hd++;
        // 弹出队尾较小元素
        while (hd <= tl && a[q[tl]] <= a[i])
            tl--;
        // 当前下标入队尾
        q[++tl] = i;
        // 窗口成型即输出
        if (i >= k) printf("%d ", a[q[hd]]);
    }
    return 0;
}

CSP-J · 编程模板的其它内容

打字首页 · 词库画廊 · 编程打字 · 指法入门 · 天梯榜 · 数据分析 · 班级课堂 · 关于我们
椰程 TypeBuddy 打字搭子 —— 键盘指法练习 · 单词记忆 · 班级课堂 · 在线 PK