不解释了,求固定长度的区间最大值和最小值,单调队列即可。。
1 # include <cstdio>
2 //# include <iostream>
3 using namespace std;
4 const int N=1000005;
5 int data[N],q[N],s=-1,e=-1;
6 int main()
7 {
8 int n,k;
9 scanf("%d%d",&n,&k);
10 for(int i=0;i<n;i++)
11 scanf("%d",data+i);
12 for(int i=0;i<n;i++)
13 {
14 while(s!=e&&i-q[s+1]>=k) s++;
15 while(s!=e&&data[q[e]]>=data[i]) e--;
16 q[++e]=i;
17 if(i>=k-1) printf("%d%c",data[q[s+1]],i!=n-1?' ':'\n');
18 }
19 s=e=-1;
20 for(int i=0;i<n;i++)
21 {
22 while(s!=e&&i-q[s+1]>=k) s++;
23 while(s!=e&&data[q[e]]<=data[i]) e--;
24 q[++e]=i;
25 if(i>=k-1) printf("%d%c",data[q[s+1]],i!=n-1?' ':'\n');
26 }
27 // system("pause");
28 return 0;
29
30 }
31