P1886 滑动窗口 /【模板】单调队列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
#include <algorithm>
#include<queue>
using namespace std;
#define ll long long
const int N=1e6+100;
ll n,k;
ll a[N];
int q[N];
inline void read(ll &x)//快读
{
x=0;
short flag=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
flag=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
x*=flag;
}
int main()
{
read(n);read(k);
for(int i=1;i<=n;i++)
{
read(a[i]);
}
//维护窗口最小值
int head=1,rear=0;
for(int i=1;i<=n;i++)
{
while(head<=rear&&a[q[rear]]>=a[i])//区别于此
rear--;
q[++rear]=i;
if(q[head]<i-k+1)
head++;
if(i>=k)
printf("%lld ",a[q[head]]);
}
printf("\n");
//维护窗口的最大值
head=1,rear=0;
for(int i=1;i<=n;i++)
{
while(head<=rear&&a[q[rear]]<=a[i])//区别于此
rear--;
q[++rear]=i;
if(q[head]<i-k+1)
head++;
if(i>=k)
printf("%lld ",a[q[head]]);
}
return 0;
}