AB数对
题目描述
出题是一件痛苦的事情!今天老师出这样一道题看学会编程的你是否可以求出来。
小明是个数学爱好者,非常喜欢研究一些数字问题,一天他看到一大串数字,想到这些数字可以组成很多的算式吧,比如加法减法,但他想知道某两个数相减的结果是一个固定值的算式到底有多少题,请你帮他想想办法!
当然了如果几个数字一样的话也算成不同的算式。
输入
输入共两行。
第一行,两个整数n,c,c表示那个相减的差。
第二行,n个整数,作为要求处理的那串数。
输出
一行,表示该串数中包含的满足 A - B = C 的数对的个数。
样例输入
4 1
1 1 2 3
样例输出
3
提示
对于 40% 的数据,1≤N≤2000。
对于 100% 的数据,1≤N≤200000,所有数小于100000,其中30%的每个数小于 2^30。
思路:
本道题目使用二分及可作对
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,d,a[200005],b[10005],ans;
int main(){
cin>>n>>d;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<n;i++){
int l=i+1,r=n,mid,e=-1,s=0;
while(l<=r){
mid=(l+r)/2;
if(a[mid]-a[i]==d){
e=mid;
l=mid+1;
}
else if(a[mid]-a[i]>d)r=mid-1;
else l=mid+1;
}
l=i+1,r=n;
while(l<=r){
mid=(l+r)/2;
if(a[mid]-a[i]==d){
s=mid;
r=mid-1;
}
else if(a[mid]-a[i]>d)r=mid-1;
else l=mid+1;
}
ans+=e-s+1;
}
cout<<ans<<endl;
}