描述
给出一串数以及一个数字 C,要求计算出所有 A - B = C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入
输入共两行。
第一行,两个整数 N, C。
第二行,N 个整数,作为要求处理的那串数。
输出
一行,表示该串数中包含的满足 A - B = C的数对的个数。
输入样例 1复制
4 1 1 1 2 3
输出样例1复制
3
提示
【数据范围】
对于 75% 的数据,1⩽N⩽2000。
对于 100% 的数据,1⩽N⩽2×10^5。
保证所有输入数据绝对值小于 2^30。
这道题是二分查找
#include<bits/stdc++.h>
using namespace std;
long long n,c,a[2000001],cnt,st;
int main(){
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);//先排序
for(int i=1;i<n;i++){//遍历每一个B
int l=i+1,r=n;//寻找A第一次出现的位置,使得A-B=C
while(l<r){//因为是第一次出现,尽量往左,模板1
int mid=(l+r)/2;
if(a[mid]-a[i]>=c) r=mid;//判断:在目标值的右边,满足,往左来
else l=mid+1;
}
if(a[l]-a[i]==c) st=l;//能找到C就继续
else continue;
l=st-1,r=n;//查找A最后出现的位置
while(l<r){//因为是最后依次出现,尽量往右,模板2
int mid=(l+r+1)/2;
if(a[mid]<=a[st]) l=mid;//判断:在目标值的左边,满足,往右去
else r=mid-1;
}
cnt+=l-st+1;//最后出现的位置减首次出现的位置就是区间长度,即A的个数
}
cout<<cnt;
return 0;
}