蓝桥杯备赛:Day3-P1102 A-B 数对

📚 算法笔记:P1102 A-B 数对 (枚举与哈希查找)

1. 题目简述

P1102 A-B 数对 - 洛谷

给出一个长度为 N N N 的正整数数列和一个整数 C C C,求有多少个不同的数对 ( A , B ) (A, B) (A,B) 满足 A − B = C A - B = C A−B=C。

  • 数据范围 : N ≤ 2 × 10 5 N \le 2 \times 10^5 N≤2×105,答案可能超过 int 范围。

2. 核心代码 (C++ 实现)

C++ 复制代码
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
int N;
ll c;
ll arr[200005];  // 存储原始数列
map<ll, ll> cnt; // 存储每个数字出现的次数 (Key:数字, Value:次数)
ll ans = 0;      // 最终对数,必须用 long long

void solve()
{
    // 1. 读入数据并进行安全检查
    if(!(cin >> N >> c)) return;
    
    // 2. 第一次遍历:读入数组并统计每个数字出现的频率
    for (int i = 1; i <= N; i++)
    {
        cin >> arr[i];
        cnt[arr[i]]++; // map 自动处理:若不存在则初始化为0再++
    }
    
    // 3. 第二次遍历:将每个数看作 B,寻找符合条件的 A
    for (int i = 1; i <= N; i++)
    {
        // 变形公式:A - B = C  =>  A = B + C
        // 我们当前枚举的是 B (即 arr[i]),我们要找 A (即 arr[i] + c)
        // 直接从 map 中获取 A 出现的次数并累加到答案中
        ans += cnt[arr[i] + c];
    }
    
    // 4. 输出最终结果(注意不要写在循环内部)
    cout << ans << endl; 
}

int main()
{
    // 竞赛必备优化
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    solve();
    return 0;
}

3. 核心考点与注意事项

🔍 核心考点
  1. 公式变形 :将 A − B = C A - B = C A−B=C 转化为 A = B + C A = B + C A=B+C。这是算法优化的前提,将"寻找两个变量"转化为"固定一个变量,查找另一个变量"。
  2. 哈希表计数 :利用 std::map 实现 O ( log ⁡ N ) O(\log N) O(logN) 的查找效率。如果使用双重 for 循环( O ( N 2 ) O(N^2) O(N2)),面对 2 × 10 5 2 \times 10^5 2×105 的数据量会彻底超时。
  3. 数据类型意识
    • 计数结果 : N N N 个数如果全部相同且 C = 0 C=0 C=0,答案是 N 2 N^2 N2,会爆 int
    • Key 值 :输入的数字可能很大,map 的键必须用 long long
⚠️ 注意事项
  • Map 的副作用 :访问 cnt[x] 时,如果 x 不存在,map 会自动插入一个 0。在本题中由于我们只是累加次数,不影响结果,但在某些统计总数的场景下需谨慎。
  • 重复数字处理 :题目求的是"数对"数量,因此必须统计频率。例如 1 1 2 2 找 C = 1 C=1 C=1 的对数,答案应为 4(每个 1 都能匹配两个 2)。

4. 易错点回顾 (My Mistakes)

  1. 输出位置错误 :误将 cout 放在了遍历 B B B 的 for 循环内部,导致输出了每一阶段的中间累加值,而非最终结果。
  2. 代码逻辑顺序 :最初尝试在读入的同时进行匹配。纠正: 这种题目最稳妥的做法是"先全部读入并统计完毕",再进行二次遍历匹配,防止逻辑遗漏。
相关推荐
fpcc17 分钟前
ubuntu26环境下的开发环境安装处理
c++·并行编程
charlie1145141912 小时前
Cinux · 第一次跳进 Ring 3:用户态与特权隔离
开发语言·c++·操作系统·开源项目
别动我齐刘海2 小时前
机器学习基础2——C++、OpenCV、点云、Open3D
c++·人工智能·opencv·机器学习·计算机视觉·机器人·ros2
躺不平的理查德2 小时前
Windows C++ 第三方库使用流程备忘录--OpenCV
开发语言·c++
余额瞒着我当琳2 小时前
C++STL容器string--迭代器,string的接口,string的遍历,访问方式
c++
郭涤生2 小时前
rootfs 详解与裁剪优化记录
linux·c++·bsp
小小龙学IT3 小时前
C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效
开发语言·c++·算法
noipp3 小时前
推荐题目:洛谷 P16689 出征
java·开发语言·数据结构·c++·算法·洛谷·luogu
码匠许师傅4 小时前
【C++ 面试真题】聊聊 volatile 和 mutable
开发语言·c++·面试
(Charon)4 小时前
【C++】线程安全队列(二):生产者消费者模型与 condition_variable 阻塞等待
c语言·开发语言·c++