AcWing 154. 滑动窗口
原题链接
简单
作者:
云_580
,
2024-09-05 13:41:32
,
所有人可见
,
阅读 2
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int n,m,head,rear;
int q[N],mn[N],mx[N],a[N];
int main(){
cin>>n>>m;
for(int i = 1;i<=n;i++){
cin>>a[i];
//如果队列不为空且a[i]<a[q[rear-1]],就弹出队尾元素
while(head<rear&&a[i]<a[q[rear-1]])rear--;
//压入i
q[rear++]=i;
//弹出不在滑动窗口内的元素
while(q[head]<i-m+1)head++;
//记录答案
if(i>=m)mn[i]=a[q[head]];
}
for(int i = m;i<=n;i++)cout<<mn[i]<<" ";
cout<<endl;
head=rear=0;
for(int i = 1;i<=n;i++){
//如果队列不为空且a[i]>a[q[rear-1]],就弹出队尾元素
while(head<rear&&a[i]>a[q[rear-1]])rear--;
//压入i
q[rear++]=i;
//弹出不在滑动窗口内的元素
while(q[head]<i-m+1)head++;
//记录答案
if(i>=m)mx[i]=a[q[head]];
}
for(int i = m;i<=n;i++)cout<<mx[i]<<" ";
return 0;
}