题目
思路
这道题是单调队列模板题
刚好复习一下。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int minn[1000010],maxn[1000010],q[1000010];
int n,k,a[1000010];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
int hd=1,tl=1;
q[1]=1,minn[1]=a[1];
for(int i=2; i<=n; i++)
{
while(q[hd]+k-1<i&&hd<=tl)
hd++;
while(a[q[tl]]>=a[i]&&hd<=tl)
tl--;
q[++tl]=i;
minn[i]=a[q[hd]];
}
for(int i=k; i<=n; i++)
printf("%d ",minn[i]);
printf("\n");
memset(q,0,sizeof(q));
hd=1,tl=1;
q[1]=1,maxn[1]=a[1];
for(int i=2; i<=n; i++)
{
while(q[hd]+k-1<i&&hd<=tl)
hd++;
while(a[q[tl]]<=a[i]&&hd<=tl)
tl--;
q[++tl]=i;
maxn[i]=a[q[hd]];
}
for(int i=k; i<=n; i++)
printf("%d ",maxn[i]);
return 0;
}