M
```
int a[1000100],q[1000100];
int main()
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int hh=1,tt=0;//初始化单调队列的头指针hh为1,尾指针tt为0,此时队列为空
for(int i=1;i<=n;i++)
{
while(tt>=hh&&a[q[tt]]>=a[i]) tt--;
//当队列不为空tt >= hh且尾部元素>=当前元素a[i] 时,将尾部元素弹出(tt--),让队列单调增
q[++tt]=i;
if(q[hh]<i-k+1) hh++;
if(i>=k) printf("%d ",a[q[hh]]);
}
printf("\n");
hh=1,tt=0;
for(int i=1;i<=n;i++)
{
while(tt>=hh&&a[q[tt]]<=a[i]) tt--;
q[++tt]=i;
if(q[hh]<i-k+1) hh++;
if(i>=k) printf("%d ",a[q[hh]]);
}
return 0;
◮:滑动窗体→两中括号,维护一个队列:见P14;本题利用单调队列来解决滑动窗口的最值问题。对于找最小值,维护一个单调递增队列,队列头部始终是当前窗口的最小值;对于找最大值,维护一个单调递减队列,队列头部始终是当前窗口的最大值
◮:
浙公网安备 33010602011771号