源代码1:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
long long int i,j,k,l,r,n,t,m,mid;
long long int a[100005];
scanf("%d",&t);
while(t--)
{
long long int ans=0;
scanf("%I64d%I64d",&n,&k);
for(i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
}
sort(a,a+n);
r=1;
for(i=0;i<n;i++)
{
l=i+1;
r=n-1;
while(l<=r)
{
mid=(l+r)/2;
if(a[mid]-a[i]>k) r=mid-1;
else l=mid+1;
}
ans=ans+r-i;
}
printf("%I64d\n",ans);
}
}
源代码2:
用算法库lower_bound()做
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100005
int a[N];
int main()
{
// freopen("E:\input.txt", "r", stdin);
int t;
ll ans;
cin >> t;
while (t--)
{
int n, k, i;
cin >> n >> k;
for (i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
ans = 0;
for (i = 0; i < n; i++)
{
ans += i - (lower_bound(a, a + n, a[i] - k) - a);
}
printf("%I64d\n", ans);
}
return 0;
}