题意:有整数的序列。 您的任务是找到满足以下条件的最长子序列:子序列的最大元素与最小元素之间的差值不小于m且不大于k。
维护两个单调队列,一个最大,一个最小,然后根据两个队列队首元素的差值剔除队首元素。 然后更新最大长度。
答案的初始值要为0,为1则wa,因为当一个元素时,最大,最小都是他,有可能不满足大于M的情况。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100000+10;
int num[maxn];
int q1[maxn],q2[maxn];
int main()
{
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
int fr1=0,fr2=0,ba1=0,ba2=0,nows = 1,ans=1;
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
while(fr1<ba1&&num[q1[ba1-1]]<num[i]) ba1--;
while(fr2<ba2&&num[q2[ba2-1]]>num[i]) ba2--;
q1[ba1++] = i; q2[ba2++] = i;
while(fr1<ba1&&fr2<ba2&&num[q1[fr1]]-num[q2[fr2]]>k)
{
if(q1[fr1]<q2[fr2]) nows = q1[fr1++]+1;
else nows = q2[fr2++]+1;
}
if(fr1<ba1&&fr2<ba2&&num[q1[fr1]]-num[q2[fr2]]>=m)
{
ans = max(ans,i-nows+1);
}
}
printf("%d\n",ans);
}
return 0;
}