这题跟那个滑动窗口很像啊,就是滑动窗口是只有多于m个数字才会输出,而该题则是不足m个数就直接从1开始比对(本来还以为是个环。。),那么这题还有要注意的一点就是这题的m个数字不包含自身,故最后一个数据其实是没用的,那么就可以在最开始输出个0,之后当成包含自身的情况,最后少处理一个数,代码如下
int n,m,top,down=1;//头文件啥的自己加了啊。。太长了。。浪费格子。。
int a[N],q[N];
int get(){//快读
int z=1,y=0;
char zy=getchar();
while(zy>‘9‘||zy<‘0‘){
if(zy==‘-‘)z=-1;
zy=getchar();
}
while(zy>=‘0‘&&zy<=‘9‘){
y=y*10+zy-‘0‘;
zy=getchar();
}
return z*y;
}
int main(){
scanf("%d%d",&n,&m);
printf("0\n");//首先输出0
for(int i=1;i<n;i++){
scanf("%d",a+i);
while(top>=down&&a[q[top]]>=a[i])top--;//维护单调性
q[++top]=i;
while(q[down]<=i-m)down++;//m个数
printf("%d\n",a[q[down]]);//也可以不输出0,将这句话调至while循环第一句,执行n次,效果相同
}
return 0;
}
嗯
原文:https://www.cnblogs.com/hahaha2124652975/p/11191398.html