第一行为两个整数n和k(0≤k≤109)
接下来是n行,每行一个正整数,表示序列值,保证均为正整数且不超过109。
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int len[N]; //以i开头的最长子序列
int maxlen[N]; //i右侧的最长子序列
int w[N];
int n, k;
int find(int i) {
//找到与w[i]之差小于等于k最大元素
int l = i, r = n - 1;
int target = w[i] + k;
while (l < r) {
int mid = (l + r + 1) / 2; //+1避免死循环
if (w[mid] == target) {
return w[mid];
}
else if (w[mid] > target) {
r = mid - 1;
}
else {
l = mid;
}
}
return w[l];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("D:/VS CODE/C++/in.txt", "r", stdin);
freopen("D:/VS CODE/C++/out.txt", "w", stdout);
#endif
cin >> n >> k;
unordered_map<int, int> last; //记录一个数的最后出现的位置
for (int i = 0; i < n; i++) {
int a;
scanf("%d", &a);
w[i] = a;
}
sort(w, w + n);
for (int i = 0; i < n; i++) {
last[w[i]] = i;
}
for (int i = 0; i < n; i++) {
int r = last[find(i)]; //找到最后一个满足条件的数的索引
len[i] = r - i + 1;
}
for (int i = n - 1; i >= 0; i--) {
maxlen[i] = max(len[i], maxlen[i + 1]);
}
int ans = 0;
for (int i = 0; i < n; i++) {
//以i开头的最长子序列 + 该序列右边的最长子序列
ans = max(ans, len[i] + maxlen[i + len[i]]);
}
cout << ans;
fclose(stdin);
fclose(stdout);
return 0;
}



京公网安备 11010502036488号