题目:
解答:
#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
#include<cstring>
using namespace std;
long long i,d,n,mid,ans;
long long a[1000010];
int main()
{
cin>>n>>d;
for(i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
{
long long left=1,right=i-1;
while(left<=right)
{
mid=(left+right)/2;
if(a[i]-a[mid]>d) left=mid+1;
else right=mid-1;
}
ans+=i-left;
left=i+1,right=n;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]-a[i]>d) right=mid-1;
else left=mid+1;
}
ans+=right-i;
}
cout<<ans/2;//最后结果千万别忘记除以2,因为每一对奶牛都统计了一次和它能交流的奶牛和能和它交流的奶牛对它的统计
return 0;
}
这题用双循环会超时,别问我怎么知道的🫠