单调队列
程序员文章站
2022-08-03 17:42:17
单调队列特点队列中的元素单调运用deque容器实现,保证能在两端操作由于每个元素最多进队一次,出队一次,所以O(1)单调队列例题输入输出样例8 31 3 -1 -3 5 3 6 7-1 -3 -3 -3 3 33 3 5 5 6 7在线OJ暴力搜索反正是会TLE,考虑单调队列O(n)#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;int n, k, p[...
单调队列特点
- 队列中的元素单调
- 运用deque容器实现,保证能在两端操作
- 由于每个元素最多进队一次,出队一次,所以O(1)
单调队列例题
输入输出样例
8 3
1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3
3 3 5 5 6 7
OJ
暴力搜索反正是会TLE,考虑单调队列O(n)
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
int n, k, p[1000005];
deque<int>deq;//存放元素在原序列中的下标
int main() {
ios::sync_with_stdio(false);//和用scanf提速差不多的作用,没用这个就会超时
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> p[i];
}
for (int i = 1; i <= n; i++) {
while (!deq.empty() && p[deq.back()] > p[i]) {//只要队尾元素大于此时要加入的元素,就pop
deq.pop_back();
}
deq.push_back(i);
if (i >= k) {//输出
while (!deq.empty() && deq.front() <= i - k) {//删除不在此时k区间范围内的元素
deq.pop_front();
}
cout << p[deq.front()] << " ";
}
}
cout << endl;
while (!deq.empty()) {
deq.pop_back();
}
for (int i = 1; i <= n; i++) {
while (!deq.empty() && p[deq.back()] < p[i]) {//与输出小值一样的思想
deq.pop_back();
}
deq.push_back(i);
if (i >= k) {
while (!deq.empty() && deq.front() <= i - k) {
deq.pop_front();
}
cout << p[deq.front()] << " ";
}
}
cout << endl;
return 0;
}
本文地址:https://blog.csdn.net/weixin_45776185/article/details/107361785
上一篇: django html母版
下一篇: 杏仁产地,中国的杏仁主要生产在哪里?