Niu Ke Xiao Bai Yue 24 B
この質問は一般的に非常に単純です
。Upper_lound(,, x):xより大きい最初の数を返します。これはこの質問に役立ちます。ほとんどの人が
必要です。間隔全体である必要があるため、スライディングウィンドウ
分析の使用を検討してください:最初に配列をソートします。特定のセグメントを取得する必要があります。このセグメントの最大-最小<= k、キーはどのセグメントですか。それぞれの数値について、振り返って最初の1からそれを引いた数> kを見つけます。中央のセグメントは、2つの数値<= kの差を満たします。検索プロセスでは、upper_lound(,, x)を使用できます。これは、xより大きい最初の数値を返します。
#include<iostream>
#include<algorithm>
using namespace std;
#include<cmath>
const int maxn=2e5+10;
typedef long long ll;
ll n,k;
ll a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
ll ans = 0;
for(int i=0;i<n;i++)
{
ll md = upper_bound(a,a+n,a[i]+k)-a; //注意要减去a(数组名)才是下标
ans=max(ans,md-i); //不断更新那个滑动窗口
}
cout<<ans<<endl;
}
return 0;
}