单调队列可以干什么:
解决滑动窗口问题。 动态维护区间长度一定的连续数组元素中的最值。
·单调队列的构造(deque实现)
对于给定区间长度为k,长度为n的数组a:
deque<int>inc;
for(int i=1;i<=n;i++)
{
while(!inc.empty()&&a[i]>a[inc.front()]) inc.pop_front();
inc.push_front(i);
if(inc.back()<=i-k)
inc.pop_back();
}
单调递增队列inc的最后一个元素即对应区间的最大元素的下标
单减队列实现同理。
典例:

参考代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[x]=i;
}
deque<int>inc;
deque<int>dec;
int ans=1e9;
for(int i=1;i<=n;i++)
{
while(!inc.empty()&&a[i]>a[inc.front()]) inc.pop_front();
inc.push_front(i);
if(inc.back()<=i-k) inc.pop_back();
while(!dec.empty()&&a[i]<a[dec.front()]) dec.pop_front();
dec.push_front(i);
if(dec.back()<=i-k) dec.pop_back();
if(i>=k)
{
ans=min(ans,a[inc.back()]-a[dec.back()]);
}
}
cout<<ans;
return 0;
}

7818

被折叠的 条评论
为什么被折叠?



