John has n points on the X axis, and their coordinates are (x[i],0),(i=0,1,2,…,n−1). He wants to know how many pairs<a,b> that |x[b]−x[a]|≤k.(a<b)
Input
The first line contains a single integer T (about 5), indicating the number of cases.
Each test case begins with two integers n,k(1≤n≤100000,1≤k≤109).
Next n lines contain an integer xi, means the X coordinates.
Output
For each case, output an integer means how many pairs<a,b> that |x[b]−x[a]|≤k.
Sample Input
2
5 5
-100
0
100
101
102
5 300
-100
0
100
101
102
Sample Output
3
10
题意:
给你n个在x轴上的坐标的横坐标值(实际上就是给你一个数列);
然后让你判断里面有多少种组合满足 | x[ b ]- x [ a ] | <= k;
思路:
很显然不能使用两重循环,先排序,对于每一个坐标,向右找到最右的而且满足条件的位置,那么这点的答案为两点之间的所有点,对于找点,二分可得
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=1e5+7;
#define INF 0x3f3f3f
int a[maxx];
int main()
{
int t;
cin >>t;
while(t--)
{
int n,k,cot=0;
cin >>n>>k;
for(int i=0;i<n;i++)
cin >>a[i];
sort(a,a+n);
ll sum=0;
for(int i=0;i<n;i++)
{
int l=i+1,r=n-1,mid;
while(l<=r)
{
mid=(r-l)/2+l;
if(abs(a[mid]-a[i])<=k)
l=mid+1;
else r=mid-1;
}
sum+=l-i-1;
}
cout <<sum<<endl;
}
return 0;
}