#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define max(a, b) ((a) > (b) ? (a) : (b))
inline void read(long long &x)
{
char ch = getchar(), c = ch;x = 0;
while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
if(c == ‘-‘)x = -x;
}
const int INF = 0x3f3f3f3f;
const int MAXN = 3000000 + 10;
long long k,l,n,num,ans,q1[MAXN],q2[MAXN],rank1[MAXN],rank2[MAXN],head1,tail1,head2,tail2;
int main()
{
read(k), read(n);
ans = 1;
read(num);
head1 = tail1 = head2 = tail2 = l = 1, q1[1] = q2[1] = num;
rank1[1] = rank2[1] = 1;
//q1单调递减
//q2单调递增
for(register int i = 2;i <= n;++ i)
{
read(num);
while(num >= q1[tail1] && tail1 >= head1)-- tail1;
q1[++tail1] = num;
rank1[tail1] = i;
while(num <= q2[tail2] && tail2 >= head2)-- tail2;
q2[++tail2] = num;
rank2[tail2] = i;
while(q1[head1] - q2[head2] > k && head1 <= tail1 && head2 <= tail2)
{
++ l;
while(rank1[head1] < l && head1 <= tail1)++ head1;
while(rank2[head2] < l && head2 <= tail2)++ head2;
}
ans = max(ans, i - l + 1);
}
printf("%d", ans);
return 0;
}
来源: http://www.bubuko.com/infodetail-2290051.html