ハング電気5178(練習の半分!)


ジョンはX軸上のn個の点を有し、そしてそれらの座標は(X [i]が、0)、(iは0,1,2 =、...、N-1)。彼は知りたいどのように多くのペア<A、B>その| X [B] -x [A] |。≤k(<B)

最初の行は、ケースの数を示し、T(約5)単一の整数を含んでいます。
各テストケースは、二つの整数N、K(1≤n≤100000,1≤k≤109)で始まります。
次のn行は、X整数含有iは、X座標を意味します。

各場合について、出力整数手段何組<A、B>は|≤k| -X [A] [B]×。

質問の意味は:ああ[i]は、[j]は[J] -a [I]を<満たすどのように多くのペアを見つけることです= K;。

アイデア:まず、あなたがあなたが並べ替え、その後、取得したいということを考えることができること、そして私たちは、小さな開始した場合のライン上の各半分の点で、見つけること!

#include<bits/stdc++.h>
#define maxn 300000+100
using namespace std;
typedef long long ll;

int  a[maxn];
int n,k;
int t;
ll num; 

int bs(int l,int r,int tag){
	int mid,ans=0;
	while(l <= r && r < n){
		mid = (l+r)/2;
		if(a[mid] <= tag){
			ans += mid -l+1;
			l = mid +1;
		}
		else{
			r = mid - 1;
		}
	}
	return ans;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--){
		num = 0;
		cin>>n>>k;
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		sort(a,a+n);
		for(int i=0;i<n;i++)
		 num += bs(i+1,n-1,a[i]+k);
		 
		cout<<num<<endl;
	}
}
公開された121元の記事 ウォンの賞賛3 ビュー3360

おすすめ

転載: blog.csdn.net/qq_45585519/article/details/104223567