维护单调队列。
递增队列
递减队列
#include<iostream>
#include<cmath>
#include<string.h>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<string>
#define MAXN 1000005
using namespace std;
typedef long long ll;
int p[MAXN], q[MAXN], a[MAXN], head, tail, n, k;
//q[]存放当前入队元素在原序列中的位置:
//因为要判断是不是在k个中。
//进队列:队列中保存(递增/减序列)最小与当前的值;记录原元素所在序列位置
void maxseq(){
head = 1; tail = 0;
for(int i = 1; i <= n; i++){
while(head <= tail && p[tail] <= a[i]){
tail--;
}
p[++tail] = a[i];
q[tail] = i;
while(head <= tail && q[head] <= i-k)
head++;
if(i>=k) printf("%d ", p[head]);
}
printf("\n");
return ;
}
void minseq(){
head = 1; tail = 0;
for(int i = 1; i <= n; i++){
while(head <= tail && p[tail] >= a[i]){
--tail;
}
p[++tail] = a[i];
q[tail] = i;
while(head <= tail && q[head] <= i-k)
head++;
if(i>=k) printf("%d ", p[head]);
}
printf("\n");
return ;
}
int main(){
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
minseq();
maxseq();
return 0;
}