#808. A-B 数对

    ID: 808 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 4 上传者: 标签>其他排序二分查找GESP5级二分二分答案GESP5级训练计划二分查找与二分答案check函数课后练习

A-B 数对

题目描述

给定 n 个整数和一个整数 C,求有多少对数 (a,b) 满足 a-b=C。

输入格式

第一行两个整数 n, C。 第二行 n 个整数。

输出格式

输出满足条件的数对数量。

样例输入

4 1
1 1 2 3

样例输出


3

解题提示

数据范围分层

75% 测试点:(1 < N < 2000) 100% 完整数据: 1 <N <2*10^5

1. 暴力双重循环(仅过 75% 数据)

思路:两层循环枚举所有有序数对 ((a_i,a_j)),判断是否满足 (a_i - a_j = C),满足则计数 + 1 时间复杂度:(O(n^2)) 超时原因:当 (n=2\times10^5) 时,总运算量约 (4\times10^{10}),远超时间限制,仅小数据 (n\le2000) 可通过

2. 排序 + 二分查找(满分解法,(O(n\log n)))

先将数组升序排序; 遍历每一个元素当作等式中的 a,需要找到满足 (b = a - C) 的数字; 使用二分查找 lower_bound、upper_bound 快速算出数组中等于 b 的元素个数; 把每一轮查到的个数累加,即为最终答案。

复杂度说明:排序 (O(n\log n)),n 次二分每次 (O(\log n)),总复杂度 (O(n\log n)),可轻松通过 (2\times10^5) 大数据

额外坑点提示

数值范围 (a[i],C < 2^{30}),超出普通 int 存储上限,需使用 long long / unsigned long long 存数值; 答案总数可能很大,计数变量必须定义为 long long,防止整型溢出; n 达到 (2*10^5),输入量大,建议添加

ios::sync_with_stdio(false); 
cin.tie(nullptr);

加速读入避免超时。

蜀ICP备2025119001号-1