刚刚接触队列!!是在惭愧,仔细研读了别人的代码写的!!!!!
用两个队列分别是q1,q2,一个是维护最大值,一个维护最小值,q1里严格遵守从大到小,q2严格遵守从小到大!!!不断输出q1,q2的队首,就是最大值最小值
#include<iostream> #include<deque> using namespace std; const int x=1000010; int h[x],l[x],a[x]; int main() { int n,k; while(scanf("%d%d",&n,&k)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); deque<int> q1,q2; q1.clear(); q2.clear(); for(int i=1;i<=n;i++) { while(!q1.empty()&&a[i]>a[q1.back()]) q1.pop_back(); while(!q1.empty()&&i-k+1>q1.front()) q1.pop_front(); q1.push_back(i); h[i]=a[q1.front()]; while(!q2.empty()&&a[i]<a[q2.back()]) q2.pop_back(); while(!q2.empty()&&i-k+1>q2.front()) q2.pop_front(); q2.push_back(i); l[i]=a[q2.front()]; } for(int i=k;i<=n;i++) { if(i==n) printf("%d\n",l[i]); else printf("%d ",l[i]); } for(int i=k;i<=n;i++) { if(i==n) printf("%d\n",h[i]); else printf("%d ",h[i]); } } return 0; }