AcWing 154. 滑动窗口
原题链接
简单
作者:
rejudge
,
2021-10-05 23:10:47
,
所有人可见
,
阅读 282
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100010;
int n,k;
//q[]存下标
int a[N],q[N];
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
//第一行输出,从左至右,每个位置滑动窗口中的最小值。
int hh=0,tt=-1;//初始队列,队空
for(int i=0;i<n;i++)
{
//判断队头是否已经滑出窗口
if(hh<=tt&&i-k+1>q[hh]) hh++;
while(hh<=tt&&a[q[tt]]>=a[i]) tt--;
q[++tt]=i;
if(i>=k-1) printf("%d ",a[q[hh]]);
}
puts("");
//第二行输出,从左至右,每个位置滑动窗口中的最大值
hh=0,tt=-1;//初始队列,队空
for(int i=0;i<n;i++)
{
//判断队头是否已经滑出窗口
if(hh<=tt&&i-k+1>q[hh]) hh++;
while(hh<=tt&&a[q[tt]]<=a[i]) tt--;
q[++tt]=i;
if(i>=k-1) printf("%d ",a[q[hh]]);
}
puts("");
return 0;
}