対
ジョンは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;
}
}