前言
二分查找是算法竞赛和工程面试中的高频考点。其核心在于利用数据的'二段性'将复杂度从 O(n) 降至 O(log n)。下面通过两道经典例题,梳理二分查找的常见套路与边界细节。
A-B 数对

这道题要求统计满足 $A - B = C$ 的数对数量。由于顺序不影响结果,我们可以先对数组排序。方程变形为 $B = A - C$,其中 $C$ 已知。遍历每个 $A$,在已排序的数组中二分查找等于 $A - C$ 的元素个数。
这里可以利用 STL 中的 lower_bound 和 upper_bound 快速定位区间。
lower_bound(l, r, k): 返回第一个 $≥ k$ 的位置(左闭右开区间)。upper_bound(l, r, k): 返回第一个 $> k$ 的位置。 两者相减即为等于 $k$ 的元素个数。
注意,STL 函数仅适用于有序序列。如果数组无序,需先排序。
#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;
// 枚举 A,寻找对应的 B
for (int i = 2; i <= n; i++) {
LL b = a[i] - c;
// 在 [1, i] 范围内查找值为 b 的元素个数
ret += (a + , a + i + , b) - (a + , a + + i, b);
}
cout << ret << endl;
;
}



