作业介绍

    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 小时