ybtoj 单调队列课堂过关luogu P1886例题1滑动窗口
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ybtoj 单调队列课堂过关luogu P1886例题1滑动窗口相关的知识,希望对你有一定的参考价值。
Link
ybtoj 【单调队列课堂过关】【例题1】滑动窗口
luogu 【P1886】滑动窗口 /【模板】单调队列
题面//因为不知道侵不侵权所以就是题面是私密的,有账号的直接看转送门就可了
解题思路
对,又是八百年前在luogu A 的,而且竟然没有写博客
百年前呢,我就预料到了总有一天我会忘了单调队列是什么,所以我自己给自己写了个雷锋帮助,写的蛮不擦的建议看看
Code
#include <iostream>
#include <cstdio>
#define M 1000100
using namespace std;
int n, k, x;
int a[M], ans[M];
int hmin = 1, tmin, qmin[M], hmax = 1, tmax, qmax[M];
int minn(int x) {
while(hmin <= tmin && a[x] <= a[qmin[tmin]]) tmin --;
qmin[++ tmin] = x;
while(hmin <= tmin && qmin[hmin] <= x - k) hmin ++;
return a[qmin[hmin]];
}
int maxn(int x) {
while(hmax <= tmax && a[x] >= a[qmax[tmax]]) tmax --;
qmax[++ tmax] = x;
while(hmax <= tmax && qmax[hmax] <= x - k) hmax ++;
return a[qmax[hmax]];
}
int main() {
scanf("%d %d", &n, &k);
for(int i = 1; i < k; i ++) {
scanf("%d", &a[i]);
maxn(i), minn(i);
}
for(int i = k; i <= n; i ++) {
scanf("%d", &a[i]);
printf("%d ", minn(i));
ans[i] = maxn(i);
}
printf("\\n");
for(int i = k; i <= n; i ++)
printf("%d ", ans[i]);
}
以上是关于ybtoj 单调队列课堂过关luogu P1886例题1滑动窗口的主要内容,如果未能解决你的问题,请参考以下文章
ybtoj 单调队列课堂过关 例题2POJ 1821DP粉刷木板 & Fence
luogu P4513ybtoj线段树课堂过关例题3小白逛公园
luogu UVA10559 ybtoj 区间DP课堂过关 例题3消除木块 & 方块消除 Blocks
luogu P4170ybtoj 区间DP课堂过关 例题2木板涂色 & [CQOI2007]涂色