不做摆子哥了 upupup!!
`#include[HTML_REMOVED]
include[HTML_REMOVED]
using namespace std;
const int N = 1000010;
// hh tt 分别是队列的队头和队尾 q[N] 为队列储存数组下标 a[N] 为数组元素
int hh,tt,q[N],a[N];
int main(){
// 初始化
hh = 0, tt = -1;
// 输入数据
int n,k;
scanf("%d %d",&n,&k);
for(int i =0;i < n;i++) scanf("%d",&a[i]);
for(int i =0; i < n; i++){
// 判断队列的队头是否应该移动 当当前输入元素 下标i 与 队列队头的 距离为k 时队头应该移动
if(hh <= tt && i-k+1 > q[hh]) hh++;
// 首先保证队列不为空 当前遍历的元素a[i] <= a[q[tt]队列队尾储存的下标对应的数组的值时 队尾更新
while(hh <= tt && a[i] <= a[q[tt]]) tt--;
q[++tt] = i;
if(i-k+1 >= 0) printf("%d ",a[q[hh]]);
}
printf("\n");
// 反转找最大值 只需要更新队尾的地方反转就好了
// 但是要记得初始化
hh = 0, tt = -1;
for(int i =0; i < n; i++){
if(hh <= tt && i-k+1 > q[hh]) hh++;
// 此处while循环发生反转
while(hh <= tt && a[i] >= a[q[tt]]) tt--;
q[++tt] = i;
if(i-k+1 >= 0) printf("%d ",a[q[hh]]);
}
printf("\n");
return 0;
}`