题目链接: http://acm.oinsm.com/problem.php?cid=1031&pid=4
思路
滑动窗口的题,周赛的时候,读懂这题,就感觉似曾相识,所以当时可以想到需要去维护一个单调性,然后自己就傻傻的去用优先队列来维护了,压根就是忘掉了单调性这个概念了!(QAQ…
首先,能想到用队列来实现,但是考虑到用从后放,从前取出,所以得用deque来实现,维护一次递减,一次递增即可!
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
int num[MAXN];
int main(){
ios::sync_with_stdio(false);
int n, m;
while(cin >> n >> m) {
for(int i = 1; i <= n; i++) cin >> num[i];
deque<int> q;
// 最小值
for(int i = 1; i <= n; i++) {
while(!q.empty() && q.front() <= (i - m)) {
q.pop_front();
}
while(!q.empty() && num[q.back()] >= num[i]){
q.pop_back();
}
q.push_back(i);
if(i >= m) {
if(i != m) cout << " ";
cout << num[q.front()];
}
}
cout << endl;
while(!q.empty()) {
q.pop_front();
}
// 最大值
for(int i = 1; i <= n; i++) {
while(!q.empty() && q.front() <= (i - m)) {
q.pop_front();
}
while(!q.empty() && num[q.back()] <= num[i]){
q.pop_back();
}
q.push_back(i);
if(i >= m) {
if(i != m) cout << " ";
cout << num[q.front()];
}
}
cout << endl;
}
return 0;
}