- 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;
}