【洛谷】P1102 A-B 数对

原题链接:https://www.luogu.com.cn/problem/P1102

目录

1. 题目描述

2. 思路分析

3. 代码实现


1. 题目描述

【洛谷】P1102 A-B 数对_第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
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;
}

【洛谷】P1102 A-B 数对_第2张图片

你可能感兴趣的:(编程刷题,#,洛谷,算法,c++,洛谷,二分,stl)