CodeForces 251A
阿新 • • 發佈:2018-12-24
題意:求三點相互間的距離不超過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); } }
兩段程式碼思路相同,不同之處只是二查詢的細節問題,日後注意。。。