题目描述
为了检测生产流水线上总共 NN 件产品的质量,我们首先给每一件产品打一个分数 AA 表示其品质,然后统计前 MM 件产品中质量最差的产品的分值 Q[m] = min\{A_1, A_2, ... A_m\}Q[m]=min{A1,A2,...Am},以及第 2 至第 M + 1M+1 件的 Q[m + 1], Q[m + 2]Q[m+1],Q[m+2]... 最后统计第 N - M + 1N−M+1 至第 NN 件的 Q[n]Q[n]。根据 QQ 再做进一步评估。
请你尽快求出 QQ 序列。
输入格式
输入共两行。
第一行共两个数 NN、MM,由空格隔开。含义如前述。
第二行共 NN 个数,表示 NN 件产品的质量。
输出格式
输出共 N - M + 1N−M+1 行。
第 1 至 N - M + 1N−M+1 行每行一个数,第 ii 行的数 Q[i + M - 1]Q[i+M−1]。含义如前述。
输入输出样例
输入 #1复制
10 4 16 5 6 9 5 13 14 20 8 12
输出 #1复制
5 5 5 5 5 8 8
#include <bits/stdc++.h>
using namespace std;
int n, m;
int q1[1000001];//q为a数组内元素的下标
int a[1000001];
int min_deque() {
int h = 1, t = 0;
for (int i = 1; i <= n; i++) {
while (h <= t && q1[h] + m <= i) h++; //如果队首元素已经不在区间内,弹出
while (h <= t && a[i] < a[q1[t]]) t--; //如果队尾元素大于新元素,弹出
q1[++t] = i;//新元素入队
if(i >= m) printf("%d\n", a[q1[h]]);//输出当前区间的最小值
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
min_deque();
return 0;
}