有时候写二分,会忘掉模板,现在我给大家推一款二分模板:
void erfen(int l,int r,int x)
{
while(l<=r){
int mid=(l+r)/2;
if(x<a[mid]){
r=mid-1;
}else if(x>a[mid]){
l=mid+1;
}else{
cout<<"YES";//找到就输出YES
return;
}
}
cout<<"NO";//没有就输出NO
}
此模板可更改,如:【算法1-6】二分查找与二分答案 - 题单 - 洛谷
中的A-B 数对 - 洛谷,大家都看看,这里就不分析了。
有两个解法:
1,二分寻找
#include<bits/stdc++.h>
using namespace std;
long long n,c,a[200005],ans;
int main(){
cin>>n>>c;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
for(int i=0;i<n;i++){
int l=0,r=n-1,x=a[i]-c;
while(l<=r){
int mid=(l+r)/2;
if(x<a[mid]){
r=mid-1;
}else if(x>a[mid]){
l=mid+1;
}else{
if(mid!=i) ans++;
break;
}
}
}
cout<<ans<<endl;
return 0;
}
2,upper_bound和lower_bound
#include<bits/stdc++.h>
using namespace std;
long long n,c,a[200005],ans;
int main(){
cin>>n>>c;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
for(int i=0;i<n;i++){
ans+=upper_bound(a,a+n,a[i]-c)-lower_bound(a,a+n,a[i]-c);
}
cout<<ans<<endl;
return 0;
}