题目描述
题目要求:给你一段长度为n的序列,并且给你一个k,使得你维护一个长度为k的子序列,并且找到整个序列中全部长度为k的子序列的所有的最小值与最大值。
输入示例
8 3
1 3 -1 -3 5 3 6 7
输出示例
-1 -3 -3 -3 3 3
3 3 5 5 6 7
参考代码
#include <iostream>
using namespace std;
const int N = 100010;
int n, k;
int a[N], q[N];
int main()
{
cin >> n >> k;
// 输入
for (int i = 0; i < n; i++) cin >> a[i];
// 最小值
int h = 0, t = -1;
for (int i = 0; i < n; i++)
{
while (q[h] < i - k + 1) h++; // 队头出队
while (h <= t && a[q[t]] >= a[i]) t--; // 队尾出队
q[++t] = i; // 队尾入队
if (i >= k - 1) cout << a[q[h]] << ' '; // 使用最值
}
cout << endl;
// 最大值
h = 0, t = -1;
for (int i = 0; i < n; i++)
{
while (h <= t && q[h] < i - k + 1) h++;
while (h <= t && a[q[t]] < a[i]) t--;
q[++t] = i;
if (i >= k - 1) cout << a[q[h]] << ' ';
}
cout << endl;
return 0;
}