原题网址:P3512
#include<bits/stdc++.h>
using namespace std;
const int N = 3e6 + 10;
int a[N];
int ddd[N];//单调队列最大值
int ddx[N];//单调队列最小值
int n, k;
int len;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> k >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int dl = 1, dr = 0, xl = 1, xr = 0;
for (int l = 1, r = 1; r <= n; r++) {
while (dl <= dr && a[r] >= a[ddd[dr]]) dr--;//维护单调队列最大值
ddd[++dr] = r;
while (xl <= xr && a[r] <= a[ddx[xr]]) xr--;//维护单调队列最小值
ddx[++xr] = r;
while (a[ddd[dl]] - a[ddx[xl]] > k) {//刷新作指针
l++;
while (ddd[dl] < l) dl++;//如果dl能刷新,那么往后刷
while (ddx[xl] < l) xl++;//如果xl能刷新,那么往后刷
}
len = max (len, r - l + 1);//记录最大值
}
cout << len << endl;
return 0;
}