#include <bits/stdc++.h>
#define maxn 200005
using namespace std;
int n, x;
int a[maxn], b[maxn], n1 = 0, f[maxn], g[maxn];
int bit[maxn];
void upd(int u, int d, bool rev) {
if (!rev) for (int i = u; i <= n1; i += i & -i) bit[i] = max(bit[i], d);
else for (int i = u; i > 0; i -= i & -i) bit[i] = max(bit[i], d);
}
int get(int u, bool rev) {
int ans = 0;
if (!rev) for (int i = u; i > 0; i -= i & -i) ans = max(ans, bit[i]);
else for (int i = u; i <= n1; i += i & -i) ans = max(ans, bit[i]);
return ans;
}
void rs() {
for (int i = 1; i <= n1; i++) bit[i] = 0;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> x;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[++n1] = a[i];
}
sort(b + 1, b + n1 + 1);
n1 = unique(b + 1, b + n1 + 1) - b - 1;
int ans = 0;
for (int i = 1; i <= n; i++) {
int p = lower_bound(b + 1, b + n1 + 1, a[i]) - b;
f[i] = get(p-1, 0) + 1;
upd(p, f[i], 0);
}
rs();
for (int i = n; i >= 1; i--) {
int p = lower_bound(b + 1, b + n1 + 1, a[i]) - b;
g[i] = get(p+1, 1) + 1;
upd(p, g[i], 1);
}
rs();
for (int i = 1; i <= n; i++) {
int p = lower_bound(b + 1, b + n1 + 1, a[i]+x) - b - 1;
ans = max(ans, get(p, 0) + g[i]);
p = lower_bound(b + 1, b + n1 + 1, a[i]) - b;
upd(p, f[i], 0);
}
rs();
for (int i = n; i >= 1; i--) {
int p = upper_bound(b + 1, b + n1 + 1, a[i]-x) - b;
ans = max(ans, get(p, 1) + f[i]);
p = lower_bound(b + 1, b + n1 + 1, a[i]) - b;
upd(p, g[i], 1);
}
cout << ans;
}
/*
8 10
7 3 5 12 2 7 3 4
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |