二分算法实战:A-B 数对与高考志愿匹配
二分查找是算法竞赛中的高频考点,核心在于利用数据的有序性或'二段性'将复杂度从 O(n) 降至 O(log n)。下面通过两道经典题目,梳理排序预处理、STL 函数应用及边界处理的实战技巧。
一、A-B 数对
1.1 题目背景
给定数组和常数 C,求满足 A - B = C 的数对数量。顺序不影响结果,因此可先排序。
1.2 解题思路
由 A - B = C 可得 B = A - C。已知 C,枚举每个 A,只需在已排序数组中快速统计等于 A - C 的元素个数。这可以通过二分查找确定区间 [L, R] 来实现。
STL 辅助函数:
lower_bound:返回第一个 >= k 的位置(左闭右开区间)。upper_bound:返回第一个 > k 的位置。 两者相减即为等于 k 的元素个数。

1.3 代码实现
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
LL a[N];
int main() {
int n, c;
cin >> n >> c;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + 1 + n);
LL ret = 0;
for (int i = 2; i <= n; i++) {
LL b = a[i] - c;
// 在 [1, i] 范围内查找值为 b 的区间长度
ret += upper_bound(a + , a + i + , b) - (a + , a + + i, b);
}
cout << ret << endl;
;
}



