题目链接:https://www.luogu.com.cn/problem/P1886,https://gmoj.net/senior/#main/show/1326
分析
单调队列模板题。。。
严重怀疑纪中没题
但也好今天差点AK
分别维护单调增和单调减。。
区间过了就从头出队,进来点比之前的大(小)就从尾出队。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,a[1000005],q[1000005],h,t;
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
h=0;t=1;
for(int i=1;i<=n;i++)
{
while(h<=t&&q[h]<i-k+1) h++;//不在窗口区间里了
while(h<=t&&a[i]<a[q[t]]) t--;//在区间里,但是没有ta小,直接从后删去
t++;
q[t]=i;
if(i>=k) cout<<a[q[h]]<<' ';
}
cout<<endl;
h=0;t=1;
for(int i=1;i<=n;i++)
{
while(h<=t&&q[h]<i-k+1) h++;
while(h<=t&&a[i]>a[q[t]]) t--;//同理
t++;
q[t]=i;
if(i>=k) cout<<a[q[h]]<<' ';
}
return 0;
}