作业介绍
deque<类型> 双端队列的名字;
队列名.push_front(x);//往头部插入x
队列名.push_back(x);//往尾部插入x
队列名.pop_front();//删除头
队列名.pop_back();//删除尾
队列名.front();//返回头
队列名.back();//返回尾
队列名.size();//返回队列元素个数
队列名.empty();//返回队列是否为空,空返回1 ,不空返回0
单调队列
例如现在是一个单调增队列
队列中前一个<后一个
如果队列中从头到尾是 5 9 12
现在新增一个元素 7 需要将9和12移除,再将7加入
5 7 保持队列的单调性
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
int a[N],n,k;
int main()
{
deque<int> qmin;//求最小值队列
deque<int> qmax;//求最小值队列
cin >> n >> k;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++)
{
//单调不减少的队列
while( !qmin.empty() && a[ qmin.back() ] > a[i] ) qmin.pop_back();//队列非空 且 队尾>当前元素
qmin.push_back(i);
if(i-k+1>qmin.front()) qmin.pop_front();//队列第一个滑到了滑动窗口外面
if(i>=k)cout << a[ qmin.front() ] << " ";
}
cout << endl;
for(int i=1;i<=n;i++)
{
//单调不增加的队列
while( !qmax.empty() && a[ qmax.back() ] < a[i] ) qmax.pop_back();
qmax.push_back(i);
if(i-k+1>qmax.front()) qmax.pop_front();
if(i>=k)cout << a[ qmax.front() ] << " ";
}
return 0;
}
- 状态
- 已结束
- 题目
- 3
- 开始时间
- 2025-2-1 0:00
- 截止时间
- 2025-3-31 23:59
- 可延期
- 24 小时