题意:
给n个数和m,k,问数列中最长的子序列,其中最大值减去最小值大于等于m小于等于k
用两个单调队列,一个递增一个递减同时跑一遍,如果max-min大于k,就把i小给去除了保证len最长
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,k;
while(~scanf("%d %d %d",&n,&m,&k)){
int a[100005];
int qmin[100005]; //递减
int qmax[100005]; //递增
int num[100005];
int x1=0,x2=0;
int minleft=0,minright=0,maxleft=0,maxright=0,ans=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
while(minleft<minright && a[qmin[minright-1]]<=a[i])
minright--;
while(maxleft<maxright && a[qmax[maxright-1]]>=a[i])
maxright--;
qmax[maxright++]=qmin[minright++]=i;
while(a[qmin[minleft]]-a[qmax[maxleft]]>k){
if(qmin[minleft]<qmax[maxleft]){
x1=qmin[minleft++];
}
else{
x2=qmax[maxleft++];
}
}
if(a[qmin[minleft]]-a[qmax[maxleft]]>=m){
ans=max(ans,i-max(x1,x2));
}
}
printf("%d\n",ans);
}
}