题目链接:
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;
}