P1886 滑动窗口 /【模板】单调队列

单调队列裸题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e6+10;
 4 int a[maxn];
 5 int qmin[maxn],qmax[maxn];
 6 int pmin[maxn],pmax[maxn];
 7 int n,k;
 8 void solve_min()
 9 {
10     int head=1;
11     int tail=0;
12     for(int i=1;i<=n;i++){
13         while(head<=tail&&qmin[tail]>=a[i]){
14             tail--;
15         }
16         qmin[++tail]=a[i];
17         pmin[tail]=i;
18         while(i-pmin[head]>=k) head++;
19         if(i>=k)printf("%d ",qmin[head]);
20     }
21     printf("\n");
22 }
23 void solve_max()
24 {
25     int head=1;
26     int tail=0;
27     for(int i=1;i<=n;i++){
28         while(head<=tail&&qmax[tail]<=a[i]){
29             tail--;
30         }
31         qmax[++tail]=a[i];
32         pmax[tail]=i;
33         while(i-pmax[head]>=k) head++;
34         if(i>=k)printf("%d ",qmax[head]);
35     }
36     printf("\n");
37 }
38 int main()
39 {
40     scanf("%d%d",&n,&k);
41     for(int i=1;i<=n;i++){
42         scanf("%d",&a[i]);
43     }
44     solve_min();
45     solve_max();
46 }
View Code

 

posted @ 2020-07-20 09:47  古比  阅读(159)  评论(0编辑  收藏  举报