單調佇列(滑動視窗):紀念我因head tail的WA
初值似乎沒什麼用
然後我就WA了。。。
如果初值為h1=1,t1=0,h2=1,h1=0;
判斷head tail是加等號
如果h1==t1 可以不加
程式碼如下:
//1359:滑動視窗(pusu)//next單調佇列 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int maxn=1e6+6; int ma[maxn],a[maxn],jl[maxn];//jl記錄下標 int h1=1,t1=1,h2=1,t2=1,n,k;//初值似乎並沒有什麼影響(霧) inline int read(){ int x=0,w=0;char ch=0; while(!isdigit(ch)) {w|=ch=='-';ch=getchar();} while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return w?-x:x; } int main(){ n=read(),k=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++){//min while(h1<=t1&&a[i]<ma[t1]) t1--;//tail 隊尾刪除 ++t1;ma[t1]=a[i];// jl[t1]=i; while(h1<=t1&&jl[h1]<=i-k) h1++; if(i>k-1) // i-k+1(第一個結尾) printf("%d ",ma[h1]); } printf("\n"); memset(ma,0,sizeof(ma)); for(int i=1;i<=n;i++){//max while(h2<=t2&&a[i]>ma[t2]) t2--; t2++;ma[t2]=a[i]; jl[t2]=i; while(h2<=t2&&jl[h2]<=i-k) h2++; if(i>k-1) printf("%d ",ma[h2]); } return 0; }