AcWing 154. 滑动窗口
原题链接
简单
作者:
ls131
,
2020-05-22 09:36:16
,
所有人可见
,
阅读 546
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e6+10;
int a[N],q[N];
int main(){
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int hh=0,tt=-1;//hh head 在左边 tt tail尾巴在右边
for (int i = 0; i < n; i ++ )
{
if(hh<=tt&&i-k+1>q[hh]) hh++; //i的尾巴的这个窗户的头已经比原先的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]]);
}
return 0;
return 0;
}