蓝桥杯备赛:Day3-P1918 保龄球

📚 算法笔记:P1918 保龄球 (STL map 离散映射)

1. 题目简述

P1918 保龄球 - 洛谷

给定 N N N 堆保龄球,每堆有 a i a_i ai 个球,位置编号为 1 ∼ N 1 \sim N 1∼N。有 Q Q Q 次询问,每次给出一个数字 M M M,问哪一堆的球数恰好是 M M M。

  • 数据范围 : N , Q ≤ 10 5 N, Q \le 10^5 N,Q≤105, a i ≤ 10 9 a_i \le 10^9 ai≤109。
  • 输出要求 :存在则输出原位置编号,不存在输出 0 0 0。

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

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

typedef long long ll;
ll N;             // 堆数
map<ll, ll> Ai;   // 核心:建立从 "球的数量" 到 "位置编号" 的映射
ll Q;             // 询问次数
ll M;             // 询问的球数

void solve()
{
    // 1. 读入数据并建立映射
    if(!(cin >> N)) return;
    for(int i = 1; i <= N; i++)
    {
        ll a;
        cin >> a;
        // Key: 球数 (10^9级别), Value: 位置 (10^5级别)
        Ai[a] = i; 
    }
    
    // 2. 处理多次查询
    cin >> Q;
    for (int i = 1; i <= Q; i++)
    {
        cin >> M;
        // 使用 count 检查是否存在,时间复杂度 O(log N)
        if(Ai.count(M) == 1)
            cout << Ai[M] << "\n"; // 使用 "\n" 避免 endl 频繁刷新缓冲区
        else
            cout << 0 << "\n";
    }
}

int main()
{
    // 蓝桥杯必备:加速大量数据的输入输出
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    solve();
    return 0;
}

3. 核心考点与注意事项

🔍 核心考点
  1. 反向索引映射 :通常我们习惯用"位置"查"数值",本题要求"数值"查"位置"。在数值范围巨大( 10 9 10^9 109)而堆数有限( 10 5 10^5 105)的情况下,使用 std::map 是最优选择。

    这里的键值对的插入方式和前面学籍管理的数据插入方式很不一样,注意区分。

  2. 查找效率map 底层是红黑树,count()operator[] 的复杂度均为 O ( log ⁡ N ) O(\log N) O(logN)。总复杂度为 O ( ( N + Q ) log ⁡ N ) O((N+Q) \log N) O((N+Q)logN),能稳过 10 5 10^5 105 级别的数据。

  3. I/O 优化 :处理十万级别的输入输出时,endl 会强制清空缓冲区导致速度剧降。"\n" 是提速的关键。

⚠️ 注意事项
  • 空间换时间map 会带来额外的内存开销。虽然本题内存限制宽裕(125MB),但在更严苛的题目中,若只需计数或存在性判断且内存吃紧,可考虑 unordered_map(平均 O ( 1 ) O(1) O(1),但最坏 O ( N ) O(N) O(N))。
  • Long Long 的必要性 :球数 10 9 10^9 109 虽然在 int 范围内,但为了防止计算溢出或题目潜在升级,统一使用 ll 是更稳健的习惯。

4. 易错点回顾 (My Mistakes)

  1. 映射方向倒置 :最初尝试以位置为键。纠正: 明确"已知量"作为 Key,"待求量"作为 Value。
  2. 输入作用域错误 :曾将查询目标 M 的输入放在了循环外。纠正: 查询题目必须在每次循环内部实时读入新的目标。
  3. 语法误区 :误将成员函数 counterase 当作数组访问。纠正: 函数调用需使用 ()
  4. 不必要的删除 :曾尝试在查询后使用 erase纠正: 同一个球数可能被多次询问,不可随意删除已建立的索引。
相关推荐
青瓦梦滋4 小时前
C++的IO流与STL的空间配置器
开发语言·c++
鱼很腾apoc5 小时前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
不吃土豆的马铃薯6 小时前
4.SGI STL 二级空间配置器 allocate 与_S_refill 源码解析
c语言·开发语言·c++·dreamweaver·内存池
fufu03117 小时前
vscode配置C/C++环境,用GDB调试简单程序分享
开发语言·c++
水云桐程序员8 小时前
C++变量的概念及用法
开发语言·c++
水饺编程9 小时前
第5章,[Win32 章节] :几种典型的颜色
c语言·c++·windows·visual studio
Larry_Yanan9 小时前
QML面试常见问题(一)QML中组件呈现方式的方法有哪些
开发语言·c++·qt·ui·面试
杨校10 小时前
杨校老师课堂之C++的位运算应用专项训练
开发语言·c++
j7~10 小时前
【MYSQL】在Centos7和ubuntu22.04环境下安装
数据库·c++·mysql·ubuntu·centos
代码中介商10 小时前
C++ STL 容器完全指南(三):deque、list 与 map 深度详解
开发语言·c++