1. 程式人生 > 實用技巧 >P1886 滑動視窗 /【模板】單調佇列

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