想法是这样的,既然每次只要求最小值,那么只要比最小值就行;
用min1表示最小值,min2做替补防止min1失效就行;
然后,失败了。
不过感觉很快啊,空间也很小;

代码:
#include <cstdio>
using namespace std;
int n,m,i,min1=10000001,min2=10000001,pl1,pl2,d;
/*min1:当前区间最小的数;
min2:当前区间min1之后最小的数;
(min1之前第二小的数无意义,因为比min1更早过时);
pl1,pl2:分别表示min1和min2的位置;
d :deadline过时线,在之前的数据已经过时(每次只比较一个m大的区间);
*/
int q[1000001];
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d",&q[i]);
if(q[i]<min1){
min1=q[i];
pl1=i;
}
}//输入m个数据找到min1,和min1的位置;
for(i=pl1+1;i<=m;i++){
if(q[i]<min2){
min2=q[i];
pl2=i;
}
}//找到min2和min2的位置;
printf("%d\n",min1);//相当于搜了m次,i=m+1,d++;
d=2;
for(i=m+1;i<=n;i++){
scanf("%d",&q[i]);
if(pl1<d){//min1过时上min2
min1=min2;
pl1=pl2;
min2=1000001;
}
if(q[i]<=min1){//有比min1更小的,更改min1;
min1=q[i];
pl1=i;
}
if(pl1>=pl2)//更改后min1可能在min2后,min2变成废废;
min2=1000001;
if(min1<q[i]<=min2){//有更好的替补(min2) ,更改min2;
min2=q[i];
pl2=i;
}
d++;//死线后移;
printf("%d\n",min1);//每次输出一次最小;
}
}
萌新什么也不懂,来个人救救孩子吧;