这题是典型的单调队列,百度一下,堆、线段树、树状数组、稀疏表……我通通不会。只好抄了一个纯粹的用数组模拟的算法,脑细胞阵亡无数,才算理解了。
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前加了~就解决了,原因嘛,你懂滴。