- BC20260025's blog
 9.10 信息笔记
- @ 2024-9-10 9:29:34
 
单调队列
其中元素保持单调性的队列,有删除头部,删除尾部和在尾部插入三种操作。可以用 deque 实现。
模板:P1886
维护一个递减的单调队列,输出队头即为区间最大值,最小值的求法同理。
# include<iostream>
# include<deque>
using namespace std;
const int N=1e6+3;
struct node{
	int id,val;
	void in(int x){
		cin>>val;
		id=x;
	}
}a[N];
int n,k,ai[N],aa[N];
deque<node> mi,ma;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;++i){
		a[i].in(i);
		while(!mi.empty()&&mi.back().val>a[i].val)
			mi.pop_back();
		if(!mi.empty()&&mi.front().id<=i-k)
			mi.pop_front();
		mi.push_back(a[i]);
		ai[i]=mi.front().val;
		while(!ma.empty()&&ma.back().val<a[i].val)
			ma.pop_back();
		if(!ma.empty()&&ma.front().id<=i-k)
			ma.pop_front();
		ma.push_back(a[i]);
		aa[i]=ma.front().val;
	}
	for(int i=k;i<=n;++i) cout<<ai[i]<<" ";
	cout<<endl;
	for(int i=k;i<=n;++i) cout<<aa[i]<<" ";
	return 0;
}