双端队列deque

#include<deque>

using namespace std;

deque<int> q;//双端队列 
//q.push_front() 从前面加入
//q.pop_front() 从前面删除
//q.front() 询问前面的数是多少
//q.push_back() 从后面加入
//q.pop_back() 从后面删除
//q.back() 询问后面的数是多少

int a[maxn];

void push(int i)//单调队列的插入 插入下标为i的元素 要保证队列单调递增
{
	while (q.size() > 0 && a[q.back()] >= a[i])
		q.pop_back();
	q.push_back(i);
}

int main()
{
	cin >> n;
	for (int i=1;i<=n;i++)
		cin >> a[i];
	cin >> m;//所有长度为m的区间的最小值
	for (int i=1;i<=n;i++)
	{
		push(i);//向单调队列里面加入a[i]这个元素
		if (i-m == q.front()) q.pop_front();//把a[i-m]这个数删掉 
		if (i>=m)//区间长度已经超过m了 需要取出最小值
			cout << a[q.front()] << "\n";
	} 
		
}
posted @ 2025-06-21 20:35  Fire_poetry  阅读(8)  评论(0)    收藏  举报