求m区间内的最小值

“强烈谴责那些半夜内卷的人”

戳我看原题

题目大意

一个含有 n 项的数列,求出每一项前的 m 个数到它这个区间内的最小值。若前面的数不足 m 项则从第 1 个数开始,若前面没有数则输出 0。

思路

滑动窗口+单调队列,类似于单调栈。可以先看看单调栈<点我>
使用单调队列储存下标,保留标准是当前元素大于队列比较元素,不断进行更新维护。

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {

	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n,m;
	cin>>n>>m;
	vector<ll>a(n);
	deque<long long>x;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cout<<0<<endl;
	for(int i=1;i<n;i++){
		while(!x.empty()&&a[x.back()]>a[i-1]){x.pop_back();}
		while(!x.empty()&&x.front()<i-m)x.pop_front();
		x.push_back(i-1);
		cout<<a[x.front()]<<endl;
	}
	return 0;
}

有关单调双端队列

本题我使用的是双端队列,当然,也可以使用数组代替。有关双端队列的用法请参考以下:deque

有关其他

晚安,困了。
不过最近玩樱之诗时看到了一句有意思的话:“长夜伴浪破晓梦,梦晓浪破伴夜长”,原文为“なかきよの とおのねふりの みなめさめ なみのりふねの おとのよきかな”,有些令人动容。

posted @ 2025-02-23 13:53  Xhita  阅读(34)  评论(0)    收藏  举报