1. 题目描述
2. 思路分析
将A-B=C转化成A=B+C,然后遍历数组,让数组的每个元素加C,再查找原数组中是否存在对应数组元素+C之后的值。(数据量比较大,所以我们就用二分在查找过程中提高效率,这里就用到了二分模板)。
二分模板可以看这篇文章https://blog.csdn.net/m0_62531913/article/details/132391682?spm=1001.2014.3001.5501
因为原数组不一定是有序的,所以我们先使用C++STL库中的sort()函数进行升序排序,这样的数组就是有序的。我们查找每个元素+C第一次出现的下标和最后一次出现的下标,再让最后一次出现的下标-第一次出现的下标+1(用sum不断累加这个值),最后sum的值就是A-B数对的个数。
3. 代码实现
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
int a[N], n, c;
ll sum;
int find1(int x)
{
int l = -1, r = n;
while (l + 1 < r)
{
int mid = (l + r) >> 1;
if (a[mid] >= x) r = mid;
else l = mid;
}
if (a[r] == x) return r;
else return 0;
}
int find2(int x)
{
int l = -1, r = n;
while (l + 1 < r)
{
int mid = (l + r) >> 1;
if (a[mid] <= x) l = mid;
else r = mid;
}
if (a[l] == x) return l;
else return 0;
}
int main()
{
cin >> n >> c;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
for (int i = 0; i < n; i++)
{
int x = a[i] + c;
if (find1(x))
sum += find2(x) - find1(x) + 1;
}
cout << sum << endl;
return 0;
}