WA on #8、#22
和大部分题解做法不大一样,我是先枚举左端点,再向右拓展右端点的
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e+6 + 6;
int k, n, ans;
int a[maxn];
class que
{
public:
int head, tail;
int q[maxn];
int front()
{
return q[head];
}
int back()
{
return q[tail - 1];
}
void pop()
{
head++;
}
void push(int p)
{
q[tail] = p;
tail++;
}
void debug()
{
for (int i = head; i < tail; i++)
{
cout << q[i] << " ";
}
cout << '\n';
}
}mx, mn;
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 r = 1;
mx.push(1);
mn.push(1);
for (int l = 1; l <= n; l++)
{
while (mx.head < mx.tail && mx.front() < l)
{
mx.pop();
}
while (mn.head < mn.tail && mn.front() < l)
{
mn.pop();
}
while (abs(a[r + 1] - a[mx.front()]) <= k && abs(a[r + 1] - a[mn.front()]) <= k)
{
r++;
if (r >= n)
{
break;
}
while (mx.head < mx.tail && a[mx.back()] <= a[r])
{
mx.tail--;
}
mx.push(r);
while (mn.head < mn.tail && a[mn.back()] >= a[r])
{
mn.tail--;
}
mn.push(r);
}
if (r >= n)
{
ans = max(ans, n - l + 1);
break;
}
ans = max(ans, r - l + 1);
}
cout << ans;
return 0;
}