单调队列
Posted universeplayer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单调队列相关的知识,希望对你有一定的参考价值。
luogu P1886 滑动窗口 https://www.luogu.org/problemnew/show/P1886
1 // luogu-judger-enable-o2 2 #include<bits/stdc++.h> 3 using namespace std; 4 #define il inline 5 #define rg register 6 typedef long long ll; 7 #define max(a,b) (a)<(b)?(b):(a) 8 #define gmax(a,b) a=max(a,b) 9 #define min(a,b) (a)<(b)?(a):(b) 10 #define gmin(a,b) a=min(a,b) 11 #define FOR(i,a,b) for(rg int i=a;i<=b;++i) 12 #define For(i,a,b) for(rg int i=a;i>=b;--i) 13 #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),pa==pb)?EOF:*pa++ 14 static char buf[100000],*pa(buf),*pb(buf); 15 il int rd(){ 16 rg int x(0),w(1); 17 rg char c(gc); 18 while(c<‘0‘||c>‘9‘) 19 { 20 if(c==‘-‘) w=-1; 21 c=gc; 22 } 23 while(c>=‘0‘&&c<=‘9‘) x=x*10+c-48,c=gc; 24 return x*w;} 25 const int N=1e6+5; 26 int q[N],hd,tl; 27 int n,k,a[N],ans; 28 29 int main() 30 { 31 n=rd(),k=rd(); 32 FOR(i,1,n) a[i]=rd(); 33 hd=tl=1;ans=1e9; 34 FOR(i,1,k-1) 35 { 36 while(hd<=tl && a[q[tl]]>=a[i]) --tl; 37 q[++tl]=i; 38 } 39 FOR(i,k,n) 40 { 41 while(hd<=tl && q[hd]<=i-k) ++hd; 42 while(hd<=tl && a[q[tl]]>=a[i]) --tl; 43 q[++tl]=i; 44 printf("%d ",a[q[hd]]); 45 } 46 printf(" "); 47 hd=tl=1;ans=-(1e9); 48 FOR(i,1,k-1) 49 { 50 while(hd<=tl && a[q[tl]]<=a[i]) --tl; 51 q[++tl]=i; 52 } 53 FOR(i,k,n) 54 { 55 while(hd<=tl && q[hd]<=i-k) ++hd; 56 while(hd<=tl && a[q[tl]]<=a[i]) --tl; 57 q[++tl]=i; 58 printf("%d ",a[q[hd]]); 59 } 60 return 0; 61 }
以上是关于单调队列的主要内容,如果未能解决你的问题,请参考以下文章