🏗️ 第三部分:核心数据结构

几乎出现在每一道 USACO Bronze 和 Silver 题目中的数据结构——前缀和、排序、双指针、栈、映射和线段树。

📚 10 章 · ⏱️ 预计 2-3 周 · 🎯 目标:解决 USACO Bronze 题目

第三部分:核心数据结构

预计用时:2-3 周

第三部分是竞赛编程开始变得有趣的地方。你将学习几乎出现在每一道 USACO Bronze 和 Silver 题目中的数据结构——以及能把 O(N²) 暴力解法变成 O(N) 优雅方案的技巧。


涵盖的主题

章节主题核心思想
第 3.1 章STL 核心用法掌握强大的内置容器:sort、map、set、queue、stack
第 3.2 章数组与前缀和O(N) 预处理后,O(1) 回答区间求和查询
第 3.3 章排序与搜索排序 + 二分查找,把很多 O(N²) 问题变成 O(N log N)
第 3.4 章双指针与滑动窗口用两个协调移动的指针高效处理子数组/对
第 3.5 章单调栈与单调队列O(N) 求下一个更大元素、滑动窗口最大/最小值
第 3.6 章栈、队列与双端队列LIFO/FIFO 处理的有序数据结构
第 3.7 章哈希技术快速键查找、多项式哈希、滚动哈希
第 3.8 章映射与集合O(log N) 查找、唯一元素集合、频率统计
第 3.9 章二分答案把枚举答案转化为「猜+验证」的二分问题
第 3.10 章字符串算法KMP 字符串匹配、Trie 树(字典树)、01-Trie

💡 树形数据结构(二叉树、并查集、线段树、树状数组)已归入第五部分:图论算法(第 5.4~5.7 章)。


学完本部分后能解决什么问题

完成第三部分后,你将能够挑战:

  • USACO Bronze: 大多数 Bronze 题目使用第三部分的技术

    • 区间查询(位置 L 到 R 之间 X 类型的奶牛有多少头?)
    • 排序问题(最近点对、排名、调度)
    • 频率统计(每个值出现多少次?)
    • 栈相关问题(括号匹配、单调处理)
  • USACO Silver 入门:

    • 二分答案(攻击性奶牛、绳子切割)
    • 滑动窗口最大/最小值
    • 差分数组实现区间更新

引入的关键算法

技术章节USACO 相关度
一维前缀和3.2品种统计、区间查询
二维前缀和3.2网格上的矩形区域求和
差分数组3.2区间更新、单点查询
带自定义比较器的 std::sort3.3几乎所有 Silver 题目
二分查找(lower_boundupper_bound3.3计数、区间查询
二分答案3.3攻击性奶牛、画家分区
单调栈3.5下一个更大元素、直方图
滑动窗口(单调队列)3.5窗口最小/最大值
频率映射(unordered_map3.7统计出现次数
有序集合操作3.8第 K 小元素、区间查询

前置条件

开始第三部分前,请确认你能做到:

  • 从零编写并编译 C++ 程序(第 2.1 章)
  • 正确使用 for 循环和嵌套循环(第 2.2 章)
  • 使用数组和 vector<int>(第 2.3 章)

注意: 第 3.1 章(STL 核心用法)是本部分的第一章,将在后续章节用到之前先教你 std::sortmapset 等关键 STL 容器。


本部分学习建议

  1. 第 3.2 章(前缀和) 是 Bronze 中测试最频繁的技术。确保你能在 5 分钟内从零实现它。
  2. 第 3.3 章(二分查找) 介绍「二分答案」——这是 Silver 级别的技术,是普通解法和优秀解法的分水岭。
  3. 不要跳过练习题。 每章的练习题都是专门为培养所需直觉而精选的。
  4. 完成第 3.3 章后,你已经具备解决大多数 USACO Bronze 题目的工具。在继续学习前,尝试解 5-10 道 Bronze 题目。

🏆 USACO 技巧: 在 USACO Bronze 级别,最常用的技术是:模拟(第 2.1–2.3 章)、排序(第 3.3 章)和前缀和(第 3.2 章)。掌握这三项,几乎可以解决任何 Bronze 题目。

出发!