25.5.13
感觉很久没有写算法题了,先来个滑动队列模板题试试水,就是用双端队列来实现会很方便,拿结构体来记录是第几个数和数的值即可,再定义两个双端队列,一个使他的值单调递增一个使他的值单调递减 使队头元素为最大值或者是最小值,当超过范围k时从队头弹出元素
#include<iostream>
#include<deque>
using namespace std;
struct sq {int num, val;
};
int x;
int a[3][1000010];
deque<sq>que1;
deque<sq>que2;
int main() {int n, k;cin >> n >> k;sq m;int cnt = 1;for (int i = 1; i <=n; i++) {cin >> x;m.num = i; m.val = x;while (!que1.empty() && x >=que1.back().val) que1.pop_back();while (!que2.empty() && x <= que2.back().val) que2.pop_back();que1.push_back(m);que2.push_back(m);while (i - k >= que1.front().num)que1.pop_front();while (i - k >= que2.front().num)que2.pop_front();if (i>=k){a[0][cnt] = que1.front().val;a[1][cnt] = que2.front().val;cnt++;}}for (int i = 1; i < cnt; i++) {cout << a[1][i] << " ";}cout << endl;for (int i = 1; i < cnt; i++) {cout << a[0][i] << " ";}return 0;
}