题意:给定一个序列,求一个连续区间满足区间最大差距在l,r之间。
思路:单调队列维护最大值最小值。
分析:记录起点,维护最大值最小值在队头,当队头的差距大于l时出队,出队时选择两个队列中较小的下标,具体过程按照代码跑一遍就差不多可以理解单调队列的作用。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 25
int n,l,r,s[100005];
int main()
{
while(~scanf("%d%d%d",&n,&l,&r))
{
int m=-1,ans=0;
deque<int>p;
deque<int>q;
for(int i=0; i<n; i++)
{
scanf("%d",&s[i]);
while(!p.empty()&&s[i]>s[p.back()])
{
p.pop_back();
}
while(!q.empty()&&s[i]<s[q.back()])
{
q.pop_back();
}
p.push_back(i);
q.push_back(i);
while(!p.empty()&&!q.empty()&&s[p.front()]-s[q.front()]>r)
{
if(p.front()<q.front())
{
m=p.front();
p.pop_front();
}
else
{
m=q.front();
q.pop_front();
}
}
if(!p.empty()&&!q.empty()&&s[p.front()]-s[q.front()]>=l)
ans=max(ans,i-m);
}
printf("%d\n",ans);
}
return 0;
}