//caioj 1172
#include<cstdio>
#include<cstring>
int a[200001],f[200001],p[200001],ans[200001];//a为原数组,f为队列,p为编号,ans为结果
int n,m;
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int head=1,tail=1;
p[1]=1;
for(int i=1;i<=n;i++)
{
while(head<tail&&a[i]>f[tail-1]) tail--;//删除队列中小于这个数的数
f[tail]=a[i];//入队列
p[tail++]=i;//记录当前这个数的序号
while(p[head]<=i-m) head++;//如果队首的序号已小于当前这个数的范围(i-m+1,i),就删除队首
ans[i]=f[head];//记录结果
}
for(int i=m;i<=n;i++)
printf("%d\n",ans[i]);
}
单调队列模板
最新推荐文章于 2025-02-17 18:52:30 发布