ybtoj 单调队列课堂过关luogu P1886例题1滑动窗口

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ybtoj 单调队列课堂过关luogu P1886例题1滑动窗口相关的知识,希望对你有一定的参考价值。

【例题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]涂色

luogu P1352ybtoj 树形DP课堂过关 例题1树上求和 & 没有上司的舞会

luogu P1880ybtoj 区间DP课堂过关 例题1石子合并 & [NOI1995] 石子合并