P1440 求m区间内的最小值

小可爱的题面

这题跟那个滑动窗口很像啊,就是滑动窗口是只有多于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
");//首先输出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
",a[q[down]]);//也可以不输出0,将这句话调至while循环第一句,执行n次,效果相同
	}
	return 0;
}

  嗯

原文地址:https://www.cnblogs.com/hahaha2124652975/p/11191398.html