这题跟那个滑动窗口很像啊,就是滑动窗口是只有多于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