(转载请标明作者)
初值似乎没什么用
然后我就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=0,t1=0,h2=0,t2=0,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++){
while(h1<t1&&a[i]<ma[t1-1]) t1--;
ma[t1]=a[i];
jl[t1]=i;t1++;
while(jl[h1]<=i-k) h1++;
if(i>k-1)
printf("%d ",ma[h1]);
}
printf("\n");
memset(ma,0,sizeof(ma));
for(int i=1;i<=n;i++){
while(h2<t2&&a[i]>ma[t2-1]) t2--;
ma[t2]=a[i];
jl[t2]=i;t2++;
while(jl[h2]<=i-k) h2++;
if(i>k-1)
printf("%d ",ma[h2]);
}
return 0;
}
//感谢cls dalao提醒