1. 程式人生 > >[POJ2823]Sliding Window 滑動視窗(單調佇列)

[POJ2823]Sliding Window 滑動視窗(單調佇列)

題意

剛學單調佇列的時候做過

現在重新做一次

一個很經典的題目

 

現在有一堆數字共N個數字(N<=10^6),以及一個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動一個單位,求出每次滑動後窗口中的最大值和最小值。

思路

單調佇列

一個遞增

一個遞減

程式碼

//author: sysky
#include<cstdio>
#define N 1000006
#define INF 0X3FFFFFFF
using namespace std;
int n,k;
int mina[N],maxa[N];
int minb[N],maxb[N];
int maxl=0,maxr=1,ansmax[N]; int minl=0,minr=1,ansmin[N]; int main() { int i; scanf("%d%d",&n,&k); maxa[0]=INF; mina[0]=-INF; for(int i=1,a;i<=n;i++) { scanf("%d",&a); while(maxb[maxl]<=i-k && maxl<maxr) ++maxl; while
(minb[minl]<=i-k && minl<minr) ++minl; while(maxa[maxr-1]<=a && maxl<maxr) --maxr; while(mina[minr-1]>=a && minl<minr) --minr; maxa[maxr]=mina[minr]=a; maxb[maxr++]=minb[minr++]=i; ansmax[i]=maxa[maxl]; ansmin[i]
=mina[minl]; } for(int i=k;i<=n;i++) printf("%d ",ansmin[i]); puts(""); for(int i=k;i<=n;i++) printf("%d ",ansmax[i]); return 0; }

END.