求一个序列中一对位置上的数字的差的绝对值小于k的数量。
按升序排序之后,从1-n查找小于a[i]+k的数字的个数,所以可以二分。
答案会超int,记得用long long。
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int T,n,k,a[110000];
long long cnt;
int binary_search(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(void){
cin>>T;
while(T--){
cnt = 0;
cin>>n>>k;
for(int i=0;i<n;++i) scanf("%d",&a[i]);
sort(a,a+n);
for(int i=0;i<n;++i)
cnt += binary_search(i+1,n-1,a[i]+k);
printf("%lld\n",cnt);
}
return 0;
}