题意:求三点相互间的距离不超过d的组合有多少种
思路:遍历每一个点,向后查找距离d内点的集合个数 n ,sum+=n*(n-1)/2;查找时采用二分的方法(注意二分的一些小细节)
#include<stdio.h>
#include<iostream>
typedef long long ll;
using namespace std;
ll a[100005];
ll n,d;
ll find(ll b,ll l,ll r)
{
ll mid;
while(l<r) //1
{
mid=(l+r)/2;
if(a[mid]-a[b]>d)
r=mid; //2
else
l=mid+1;
}
mid=(l+r)/2; <span style="font-family: Arial, Helvetica, sans-serif;">//均不可省</span>
if(a[mid]-a[b]>d) //3
mid--;
return mid-b;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%lld%lld",&n,&d)!=EOF)
{
for(ll i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
ll ans=0,x;
for(ll i=0;i<n-1;i++)
{
x=find(i,i+1,n-1);
if(x<2)continue;
ans=ans+x*(x-1)/2;
}
printf("%lld\n",ans);
}
}
#include<stdio.h>
#include<iostream>
typedef long long ll;
using namespace std;
ll a[100005];
ll n,d;
ll find(ll b,ll l,ll r)
{
ll mid;
while(l<=r) // 1
{
mid=(l+r)/2;
if(a[mid]-a[b]>d)
r=mid-1; // 2
else
l=mid+1;
}
mid=(l+r)/2;//均不可省
//if(a[mid]-a[b]>d) //3
// mid--;
return mid-b;
}
int main()
{
freopen("in.txt","r",stdin);
while(scanf("%lld%lld",&n,&d)!=EOF)
{
for(ll i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
ll ans=0,x;
for(ll i=0;i<n-1;i++)
{
x=find(i,i+1,n-1);
if(x<2)continue;
ans=ans+x*(x-1)/2;
}
printf("%lld\n",ans);
}
}
两段代码思路相同,不同之处只是二查找的细节问题,日后注意。。。