刚刚接触队列!!是在惭愧,仔细研读了别人的代码写的!!!!!
用两个队列分别是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;
}