题目链接:

https://www.luogu.com.cn/problem/P2032

题目大意:

n个整数,一个长度为k的木板,木板一开始盖住了1~k个数,木板每次右移一个单位,直到右端与第n个数重合,每次移动前输出被覆盖住的数中的最大值。

思路:

求解区间内的最大值,单调队列模板题。
构造单调递减的队列,队列中储存数字的 下标

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 2000006;
int n, k, num[MAXN] = {MAXN}, s = 1, e = 0, ans[MAXN], q[MAXN];
void solve(){
	scanf("%d %d", &n, &k);
	for (int i = 1; i <= n; i++){
		scanf("%d", &num[i]);
		while (e >= s && num[i] >= num[q[e]]) e--;//构建单调递减队列,注意 e >= s !!!
		q[++e] = i;//将新数加入队列
		while (q[s] <= i - k) s++;//当这个数不被覆盖时,将这个数从队列中删除
		if (i >= k) ans[i - k + 1] = num[q[s]];
	}
	for (int i = 1; i <= n - k + 1; i++) cout << ans[i] << "\n";
}
int main(){
	solve();
	return 0;
}
posted on 2021-09-01 18:45  Hamine  阅读(38)  评论(0编辑  收藏  举报