题意:一个序列中的最大值和最小值的差在m和k之间,求这个序列的最大长度/
用单调队列。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
int a[100005];
int minn[100005],maxx[100005];
int main()
{
int n,k,m;
while(scanf("%d %d %d",&n,&m,&k)!=EOF){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int front1=0,tail1=-1,front2=0,tail2=-1,i=0,ans=0;
int bg=-1;
for(i=0;i<n;i++)
{
while(front1<=tail1&&a[i]>a[maxx[tail1]]) tail1--;
maxx[++tail1]=i;
while(front2<=tail2&&a[i]<a[minn[tail2]]) tail2--;
minn[++tail2]=i;
while(a[maxx[front1]]-a[minn[front2]]>k)
{
bg=min(maxx[front1],minn[front2]);
if(maxx[front1]==bg) front1++;
if(minn[front2]==bg) front2++;
}
if(a[maxx[front1]]-a[minn[front2]]>=m)
{
ans=max(ans,i-bg);
}
}
printf("%d\n",ans);
}
return 0;
}
单调队列中的首元素是队列中最小的下标。