题目描述
有一个长为 nn 的序列 aa,以及一个大小为 kk 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。
例如:
The array is [1,3,-1,-3,5,3,6,7], and k = 3。
输入格式
输入一共有两行,第一行有两个正整数 n,kn,k。 第二行 nn 个整数,表示序列 aa
输出格式
输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值
#include <iostream>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
int n, m;
ll maxx[maxn], minn[maxn], a[maxn];
struct node
{
ll x, y;
} v[maxn];
void getmax()
{
int head = 1, tail = 0;
for (int i = 1; i <= n; i++)
{
while (head <= tail && v[tail].x <= a[i])
tail--;
v[++tail].x = a[i];
v[tail].y = i;
while (v[head].y + m <= i)
{ //队头元素不满足条件了,可以出队
head++;
}
if (i >= m)
{
cout << v[head].x << " ";
}
}
cout << endl;
}
void getmin()
{
int head = 1, tail = 0;
for (int i = 1; i <= n; i++)
{
while (head <= tail && v[tail].x >= a[i])
tail--;
v[++tail].x = a[i];
v[tail].y = i;
while (v[head].y + m <= i)
{
head++;
}
if (i >= m)
{
cout << v[head].x << " ";
}
}
cout << endl;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
getmin();
getmax();
return 0;
}