出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
好吧,题目是这样的:给出一串数以及一个数字 CC,要求计算出所有 A - B = CA−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个整数 N, CN,C。
第二行,NN 个整数,作为
输出格式
一行,表示该串数中包含的满足 A - B = CA−B=C 的数对的个数。
要求处理的那串数。
输入
4 1 1 1 2 3
输出
3
说明/提示
对于 75\%75% 的数据,1 \leq N \leq 20001≤N≤2000。
对于 100\%100% 的数据,1 \leq N \leq 2 \times 10^51≤N≤2×105。
保证所有输入数据绝对值小于 2^{30}230,且 C \ge 1C≥1。
思路
先通过二分找到比c大的数作为a;
让a<n逐步递增寻找a-b=c的数通过二分计算b的左端和右端相减计算;最会总共统计到ans中;
#include<bits/stdc++.h>
using namespace std;
const int r=10001010;
int a[r],mid;
long long int res;
int main(){
int n,m;
cin>>n>>m;int t;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
int l=0,r=n-1;
while(l<r){
int mid=(l+r)/2;
if(a[mid]>=m)r=mid;
else l=mid+1;
}
t=l;
t++;
while(t<n){l=0,r=n-1;
while(l<r){
mid=(l+r)/2;
if(a[mid]>=a[t]-m)r=mid;
else l=mid+1;
}
if(a[l]==a[t]-m){int ll=l;l=0,r=n-1;
while(l<r){
mid=(l+r+1)/2;
if(a[mid]<=a[t]-m)l=mid;
else r=mid-1;
}
res+=l-ll+1;
}
t++;
}
printf("%lld",res);
}