单调队列来做,简单题了。维护一个最大的,一个最小的即可。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define N 1001000 int num[N]; int bigque[N],bhead,btail; int smalque[N],shead,stail; int ansb[N],anss[N],bt,st; void addbig(int v){ while(bhead<btail){ if(v>bigque[btail-1]) btail--; else break; } bigque[btail++]=v; } void addsmall(int v){ while(shead<stail){ if(v<smalque[stail-1]) stail--; else break; } smalque[stail++]=v; } int main(){ int n,k; while(scanf("%d%d",&n,&k)!=EOF){ bhead=btail=shead=stail=bt=st=0; for(int i=1;i<=n;i++) scanf("%d",&num[i]); int i; for(i=1;i<=k&&i<=n;i++){ addbig(num[i]); addsmall(num[i]); // cout<<"YES"<<endl; } if(k>=n){ printf("%d ",ansb[bt]); printf("%d ",anss[st]); } else{ ansb[bt++]=bigque[bhead]; anss[st++]=smalque[shead]; for(;i<=n;i++){ if(bigque[bhead]==num[i-k]){ bhead++; } addbig(num[i]); if(smalque[shead]==num[i-k]) shead++; addsmall(num[i]); ansb[bt++]=bigque[bhead]; anss[st++]=smalque[shead]; } printf("%d",anss[0]); for(int i=1;i<st;i++) printf(" %d",anss[i]); printf(" "); printf("%d",ansb[0]); for(int i=1;i<bt;i++) printf(" %d",ansb[i]); printf(" "); } } return 0; }