注意k等于1的情况。
#include <iostream>
#include <cstdio>
#include <queue>
#include <deque>
using namespace std;
struct s
{
int pos;
int data;
}A[1000000];
int main()
{
int n,k;
deque<s> Q;
scanf("%d%d",&n,&k);
int i;
for (i=0;i<=n-1;i++)
{
scanf("%d",&A[i].data);
A[i].pos=i;
}
if (n==1)
{
printf("%d\n",A[0].data);
printf("%d\n",A[0].data);
}
else if (k==1)
{
for (i=0;i<=n-2;i++)
printf("%d ",A[i].data);
printf("%d\n",A[i].data);
for (i=0;i<=n-2;i++)
printf("%d ",A[i].data);
printf("%d\n",A[i].data);
}
else
{
Q.push_back(A[0]);
for (i=1;i<=n-1;i++)
{
while (!Q.empty() && Q.front().data>A[i].data)
Q.pop_front();
while (!Q.empty() && Q.back().data>A[i].data)
Q.pop_back();
Q.push_back(A[i]);
//printf("A:%d\n",A[i]);
if (i-Q.front().pos>k-1)
Q.pop_front();
if (i==n-1)
printf("%d\n",Q.front().data);
else if (i>=k-1)
printf("%d ",Q.front().data);
}
Q.clear();
Q.push_back(A[0]);
for (i=1;i<=n-1;i++)
{
while (!Q.empty() && Q.front().data<A[i].data)
Q.pop_front();
while (!Q.empty() && Q.back().data<A[i].data)
Q.pop_back();
Q.push_back(A[i]);
//printf("A:%d\n",A[i]);
if (i-Q.front().pos>k-1)
Q.pop_front();
if (i==n-1)
printf("%d\n",Q.front().data);
else if (i>=k-1)
printf("%d ",Q.front().data);
}
}
return 0;
}