将能力值排序后,问题转化为“求最长的区间左右端点差不超过 的子数组长度”,双指针解决即可。

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'



void solve(){
    int n, k;
    cin >> n >> k;
    vector<int> nums(n + 5);
    for (int i = 1; i <= n; i++) cin >> nums[i];
    nums[n + 1] = 2e9 + 1;
    sort(nums.begin() + 1, nums.begin() + 1 + n);
    int l = 1, r = 1;
    int ans = 0;
    while (r <= n + 1) {
        r++;
        if (nums[r] - nums[l] > k) {
            ans = max(ans, r - l);
            while (nums[r] - nums[l] > k) l++;
        }
    }
    cout << ans << endl;
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int _T = 1;
    cin >> _T;
    while (_T--){ 
        solve();
    }
    return 0;
}