思路:stl的双端队列来模拟单调队列
#include <iostream>
#include <cstdio>
#include <deque>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 10;
int a[MAXN], b[MAXN], c[MAXN], n, k;
deque<int> deq;
int main() {
cin >> n >> k;
for(int i = 0; i < n; i++)
scanf("%d", a + i);
for(int i = 0; i < n; i++) {
while(!deq.empty() && a[deq.back()] >= a[i])
deq.pop_back();
deq.push_back(i);
if(i - k + 1 >= 0) {
b[i - k + 1] = a[deq.front()];
if(deq.front() == i - k + 1)
deq.pop_front();
}
}
deq.clear();
for(int i = 0; i < n; i++) {
while(!deq.empty() && a[deq.back()] <= a[i])
deq.pop_back();
deq.push_back(i);
if(i - k + 1 >= 0) {
c[i - k + 1] = a[deq.front()];
if(deq.front() == i - k + 1)
deq.pop_front();
}
}
for(int i = 0; i < n - k + 1; i++)
printf("%d%c", b[i], i == n - k ? '\n' : ' ');
for(int i = 0; i < n - k + 1; i++)
printf("%d%c", c[i], i == n - k ? '\n' : ' ');
return 0;
}