这题是典型的单调队列,百度一下,堆、线段树、树状数组、稀疏表……我通通不会。只好抄了一个纯粹的用数组模拟的算法,脑细胞阵亡无数,才算理解了。

 1 #include<stdio.h>
 2 #define maxn 1000001
 3 int min_1[maxn],max_1[maxn],a[maxn],n,k;
 4 void get_max()
 5 {
 6     int i,start=1,end=1;
 7     for(i=1;i<k;i++)
 8     {
 9         while(a[max_1[end]]<a[i]&&end>=start)
10             end--;
11         end++;
12         max_1[end]=i;
13     }
14     for(i=k;i<=n;i++)
15     {
16         while(max_1[start]<=i-k&&start<=end)
17             start++;
18         while(a[max_1[end]]<a[i]&&end>=start)
19             end--;
20         end++;
21         max_1[end]=i;
22         if(i!=n)printf("%d ",a[max_1[start]]);
23     }
24     printf("%d\n",a[max_1[start]]);
25 }
26 void get_min()
27 {
28     int i,start=1,end=1;
29     for(i=1;i<k;i++)
30     {
31         while(a[min_1[end]]>a[i]&&end>=start)
32             end--;
33         end++;
34         min_1[end]=i;
35     }
36     for(i=k;i<=n;i++)
37     {
38         while(min_1[start]<=i-k&&start<=end)
39             start++;
40         while(a[min_1[end]]>a[i]&&end>=start)
41             end--;
42         end++;
43         min_1[end]=i;
44         if(i!=n)printf("%d ",a[min_1[start]]);
45     }
46     printf("%d\n",a[min_1[start]]);
47 }
48 int main()
49 {
50     while(~scanf("%d%d",&n,&k))
51     {
52         for(int i=1;i<=n;i++)
53             scanf("%d",&a[i]);
54         get_min();
55         get_max();
56     }
57     return 0;
58 }


最郁闷的是,老是OLE,真是郁闷死我了,怎么可能多输出呢?后来在scanf前加了~就解决了,原因嘛,你懂滴。