| x[b]-x[a] |<=k ( b > a ) 可以转化为 x[b] - x[a] <= k , a!= b ,然后排序之后二分答案即可,找到想x[a]右边最远的x[b],二分求取就可以
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 100007
using namespace std;
typedef long long LL;
LL t,n,k;
LL a[MAX];
LL get ( LL i )
{
LL l = i , r = n , mid;
while ( l != r )
{
mid = (l + r + 1 )>> 1;
if ( a[mid]-a[i] > k ) r = mid-1;
else l = mid;
}
return l;
}
int main ( )
{
scanf ( "%lld" , &t );
while ( t-- )
{
scanf ( "%lld%lld" , &n , &k );
for ( LL i = 1 ; i <= n ; i ++ ) scanf ( "%lld" , &a[i] );
sort ( a+1 , a+n+1 );
LL ans = 0;
for ( LL i = 1 ; i < n ; i ++ )
ans += get( i ) - i;
printf ( "%lld\n" , ans );
}
}