给定一群数的集合,然后有一个大小为k的区间,这个区间从左往右滑动,输出每滑动一次,这个区间内的最大值和最小值。
G++无情的TLE了,但是!!C++压线过了!!
总之就是一个基本的单调队列,瞎搞一下就行了。
#include <cstdio>
#include <deque>
using namespace std;
const int maxn = 1000000 + 10;
int window[maxn];
int main(int argc, char const *argv[]) {
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++) {
scanf("%d", &window[i]);
}
deque<pair<int, int> > deq;
for (int i = 0; i < n; i++) {
int val = window[i];
while (!deq.empty() && val <= deq.back().first) {
deq.pop_back();
}
deq.push_back(make_pair(val, i));
if (i >= k - 1) {
while (!deq.empty() && deq.front().second < i - k + 1) {
deq.pop_front();
}
printf("%d", deq.front().first);
if (i != n - 1) {
putchar(' ');
}
}
}
putchar('\n');
deq.clear();
for (int i = 0; i < n; i++) {
int val = window[i];
while (!deq.empty() && val >= deq.back().first) {
deq.pop_back();
}
deq.push_back(make_pair(val, i));
if (i >= k - 1) {
while (!deq.empty() && deq.front().second < i - k + 1) {
deq.pop_front();
}
printf("%d", deq.front().first);
if (i != n - 1) {
putchar(' ');
}
}
}
putchar('\n');
return 0;
}