Niu Ke Xiaobai Yue 24 Bチーム

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;
} 

おすすめ

転載: www.cnblogs.com/serendipity-my/p/12745731.html