全国青少年信息学奥林匹克系列竞赛大纲 (2025年修订版)

一、简介

1.1 目的

本大纲的制定目的在于:

  • 为全国青少年信息学奥林匹克 (National Olympiad in Informatics, NOI) 系列竞赛以及中国计算机学会 (China Computer Federation, CCF) 主办的其他有关活动的题目命制提供依据;
  • 为NOI指导教师的教学提供方向和指导;
  • 为参加NOI系列竞赛、CCF主办的其他有关活动的学生和信息学爱好者的学习提供范围;
  • 为各省市开展和组织NOI省选等活动提供参照。

1.2 原则

1.2.1 等级化原则

按照目前NOI系列活动开展的现状,以及将来可能的发展,大纲将各知识点分成入门级、提高级和NOI级。高级别自动包含低级别知识点。各级别与NOI系列活动以及CCF主办的其他活动的对应关系如下:

  • 入门级: CCF非专业级软件能力认证入门组 (Certified Software Professional Junior, CSP-J);
  • 提高级: 全国青少年信息学奥林匹克联赛 (National Olympiad in Informatics in Provinces, NOIP)、CCF非专业级软件能力认证提高组 (Certified Software Professional Senior, CSP-S);
  • NOI级: 全国青少年信息学奥林匹克竞赛 (NOI) 及以上,包括国际信息学奥林匹克 (International Olympiad in Informatics, IOI) 中国队选拔 (China Team Selection, CTS)、 NOI冬令营、国家集训队集训等。

除将所有知识点划分为上述级别以外,还对每个知识点标定了学习难度系数 (范围为1 ~ 10)。考虑到相邻级别知识点的学习难度可能存在交错,因此将入门级知识点的难度系数范围设置为1 ~ 5,(除入门级知识点外的) 提高级知识点的难度系数范围设置为5 ~ 8,(除入门级、提高级知识点外的) NOI级知识点的难度系数范围设置为7 ~ 10。

各知识点难度系数以X的格式列在知识点之前。

1.2.2 差异化原则

为促进信息学和NOI活动的普及,大纲应较详尽地规定中低级别知识点的范围,以尽可能清晰地划定相应级别的知识范围,有效地指导入门学生的学习及相关的教学活动;为保证和促进我国选手在IOI竞赛中的竞争力,大纲应避免过于严格地限制命题的思路,须为NOI等高水平竞赛的题目命制留有充分的开放性,因此不宜过于细致地规定高级别知识点的范围。为此,大纲在制定中将采取“上粗下细”的指导思想: 知识级别越低,其内容规定得越细; 知识级别越高,其内容规定得越粗。

1.2.3 统一性原则

为保证大纲的简明性和系统性,高级别比赛的知识范围将自动地包含低级别比赛的所有知识点。同时,对每个级别按照竞赛环境 (Linux和Windows)、程序设计语言 (C++)、数据结构、算法以及数学等进行了分类。对每个大类又按照知识点的属性继续划分为若干小类; 某些知识点可能与多个类别均有紧密或松散联系,本大纲均按其主要属性划定其类别,以避免同一知识点在多个类别中的重复出现。

1.3 建议

建议在各级别竞赛题目的命制中,

各级别竞赛或活动的考察范围不超过对应的大纲级别,其中难度系数为10的知识点仅用于CTS; 避免对算法复杂度的常系数的考察;

部分单个知识点可能对应不同层次、不同性能的多个数据结构或算法。考察内容应以常见的、经典的内容为主,避免虽具有微弱性能优势 (例如算法复杂度的细微改进) 但较为冷僻或过新的数据结构和算法。

1.4 修订

大纲将根据NOI活动的发展而定期进行维护和修订,修订周期为两年;

本轮大纲维护小组成员为: 赵启阳 (召集人)、叶金毅、胡伟栋、金靖、李建、谢秋锋、汪星明、李曙、叶国平。欢迎将修订意见反馈给以上人员。

1.5 致谢

在本轮大纲的修订过程中,杨耀良、崔浩以及多位未具名的师生均提出了各种宝贵意见,在此表示感谢。

二、内容

2.1 入门级

2.1.1 基础知识与编程环境

  • 计算机的基本构成 (CPU、内存、I/O设备等)
  • Windows、Linux等操作系统的基本概念及其常见操作
  • 计算机网络和Internet的基本概念
  • 计算机的历史和常见用途
  • NOI以及相关活动的历史
  • NOI以及相关活动的规则
  • 位、字节与字
  • 程序设计语言以及程序编译和运行的基本概念
  • 使用图形界面新建、复制、删除、移动文件或目录
  • 使用Windows系统下的集成开发环境 (例如Dev-C++等)
  • 使用Linux系统下的集成开发环境 (例如Code::Blocks等)
  • 常用编译命令g++的基本使用

2.1.2 C++程序设计

1. 程序基本概念
  • 标识符、关键字、常量、变量、字符串、表达式的概念
  • 常量与变量的命名、定义及作用
  • 头文件与名字空间的概念
  • 编辑、编译、解释、调试的概念
2. 基本数据类型
  • 整数型: int、long long
  • 实数型: float、double
  • 字符型: char
  • 布尔型: bool
3. 程序基本语句
  • cin语句、scanf语句、cout语句、printf语句、赋值语句、复合语句
  • if语句、switch语句、多层条件语句
  • for语句、while语句、do while语句
  • 多层循环语句
4. 基本运算
  • 算术运算: 加、减、乘、除、整除、求余
  • 关系运算: 大于、大于等于、小于、小于等于、等于、不等于
  • 逻辑运算: 与(&&)、或(||)、非(!)
  • 变量自增与自减运算
  • 三目运算
  • 位运算: 与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)
5. 数学库常用函数
  • 绝对值函数、四舍五入函数、下取整函数、上取整函数、平方根函数、常用三角函数、对数函数、指数函数
6. 结构化程序设计
  • 顺序结构、分支结构和循环结构
  • 自顶向下、逐步求精的模块化程序设计
  • 流程图的概念及流程图描述
7. 数组
  • 数组与数组下标
  • 数组的读入与输出
  • 二维数组与多维数组
8. 字符串的处理
  • 字符数组与相关函数
  • string类与相关函数
9. 函数与递归
  • 函数定义与调用、形参与实参
  • 传值参数与传引用参数
  • 常量与变量的作用范围
  • 递归函数
10. 结构体与联合体
  • 结构体
  • 联合体
11. 指针与引用
  • 指针
  • 基于指针的数组访问
  • 字符指针
  • 指向结构体的指针
  • 引用
12. 文件及基本读写
  • 文件的基本概念、文本文件的基本操作
  • 文本文件类型与二进制文件类型
  • 文件重定向、文件读写等操作
13. STL模板
  • 常用函数与算法模板:min、max、swap、sort
  • 栈(stack)、队列(queue)、链表(list)、向量(vector)等容器

2.1.3 数据结构

1. 线性结构
  • 链表: 单链表、双向链表、循环链表
  • 队列
2. 简单树
  • 树的定义与相关概念
  • 树的表示与存储
  • 二叉树的定义与基本性质
  • 二叉树的表示与存储
  • 二叉树的遍历: 前序、中序、后序
3. 特殊树
  • 完全二叉树的定义与基本性质
  • 完全二叉树的数组表示法
  • 哈夫曼树的定义和构造、哈夫曼编码
  • 二叉搜索树的定义和构造
4. 简单图
  • 图的定义与相关概念
  • 图的表示与存储: 邻接矩阵
  • 图的表示与存储: 邻接表

2.1.4 算法

1. 算法概念与描述
  • 算法概念
  • 算法描述: 自然语言描述、流程图描述、伪代码描述
2. 入门算法
  • 枚举法
  • 模拟法
3. 基础算法
  • 贪心法
  • 递推法
  • 递归法
  • 二分法
  • 倍增法
4. 算法策略
  • 前缀和
  • 差分
5. 数值处理算法
  • 高精度的加法
  • 高精度的减法
  • 高精度的乘法
  • 高精度整数除以单精度整数的商和余数
6. 排序算法
  • 排序的基本概念
  • 冒泡排序
  • 选择排序
  • 插入排序
  • 计数排序
7. 搜索算法
  • 深度优先搜索
  • 广度优先搜索
8. 图论算法
  • 深度优先遍历
  • 广度优先遍历
  • 泛洪算法 (Flood Fill)
9. 动态规划
  • 动态规划的基本思路
  • 简单一维动态规划
  • 简单背包类型动态规划
  • 简单区间类型动态规划

2.1.5 数学与其他

1. 数及其运算
  • 自然数、整数、有理数、实数及其算术运算 (加、减、乘、除)
  • 进制与进制转换: 二进制、八进制、十进制、十六进制
2. 初等数学
  • 代数 (初中部分)
  • 几何 (初中部分)
3. 初等数论
  • 整除、因数、倍数、指数、质 (素) 数、合数
  • 取整
  • 模运算与取余
  • 整数唯一分解定理
  • 辗转相除法 (欧几里得算法)
  • 素数筛法: 埃氏筛法与线性筛法
4. 离散与组合数学
  • 集合
  • 加法原理
  • 乘法原理
  • 排列
  • 组合
  • 杨辉三角
5. 其他
  • ASCII码

2.2 提高级

2.2.1 基础知识与编程环境

  • Linux系统终端中常用的文件与目录操作命令
  • Linux系统下常见文本编辑工具的使用
  • 常用编译命令g++与相关编译选项
  • 在Linux系统终端中运行程序, 使用time命令查看程序用时
  • 调试工具GDB的使用

2.2.2 C++程序设计

1. 类 (class)
  • 类的概念及简单应用
  • 成员函数和运算符重载
2. STL模板
  • 容器 (container) 和迭代器 (iterator)
  • 对 (pair)、元组 (tuple)
  • 集合 (set)、多重集合 (multiset)
  • 树状数组
  • 双端队列 (deque)、优先队列 (priority_queue)
  • 线段树
  • 字典树 (Trie)
  • 映射 (map)、多重映射 (multimap)
  • 笛卡尔树
  • 位集合 (bitset)
  • 平衡树: AVL、Treap、Splay等
  • 算法模板库中的常用函数
4. 常见图
  • 稀疏图

2.2.3 数据结构

1. 线性结构
  • 欧拉图
  • 双端栈
  • 有向无环图
  • 双端队列
  • 连通图与强连通图
  • 单调队列
  • 双连通图
  • 优先队列
  • ST表 (Sparse Table)
  • 哈希表
  • 数值哈希函数构造
2. 集合与森林
  • 字符串哈希函数构造
  • 并查集
  • 哈希冲突的常用处理方法
  • 树的孩子兄弟表示法

2.2.4 算法

1. 特殊树
  • 二叉堆
  • 时间复杂度分析
  • 空间复杂度分析
2. 算法策略
  • 离散化
  • 扫描线
3. 基础算法
  • 分治算法
4. 排序算法
  • 归并排序
  • 快速排序
  • 堆排序
  • 桶排序
  • 基数排序
5. 字符串算法
  • 字符串匹配: KMP算法
  • Manacher算法
6. 搜索算法
  • 搜索的剪枝优化
  • 记忆化搜索
  • 启发式搜索
  • 双向广度优先搜索
  • 迭代加深搜索
7. 图论算法
  • 最小生成树: Prim和Kruskal等算法
  • 单源最短路: Bellman-Ford、Dijkstra、SPFA等算法
  • 单源次短路
  • Floyd-Warshall算法
  • 有向无环图的拓扑排序
  • 欧拉道路和欧拉回路
  • 二分图的判定
  • 强连通分量
  • 割点、割边
  • 树的重心、直径、DFS序与欧拉序
  • 树上差分、子树和与倍增
  • 最近公共祖先
8. 动态规划
  • 多维动态规划
  • 树型动态规划
  • 状态压缩动态规划
  • 动态规划的常用优化

2.2.5 数学与其他

1. 初等数学
  • 代数 (高中部分)
  • 几何 (高中部分)
2. 初等数论
  • 同余式
  • 欧拉定理和欧拉函数
  • 费马小定理
  • 威尔逊定理
  • 裴蜀定理
  • 模运算意义下的逆元
  • 扩展欧几里得算法
  • 中国剩余定理
3. 离散与组合数学
  • 多重集合
  • 等价关系与等价类
  • 多重集上的排列
  • 多重集上的组合
  • 错排列、圆排列
  • 鸽巢原理
  • 二项式定理
  • 容斥原理
  • 卡特兰 (Catalan) 数
4. 线性代数
  • 向量与矩阵的概念
  • 向量的运算
  • 矩阵的初等变换
  • 矩阵的运算: 加法、减法、乘法与转置
  • 特殊矩阵的概念: 单位阵、三角阵、对称阵和稀疏矩阵
  • 高斯消元法

2.3 NOI级

2.3.1 C++程序设计3

  • 面向对象的程序设计思想 (OOP)

2.3.2 数据结构

1. 线性结构
  • 块状链表
2. 复杂树
  • 树链剖分
  • 动态树:LCT
  • 树套树
  • k-d树
  • 虚树
3. 可合并堆
  • 左偏树
  • 二项堆
4. 可持久化数据结构
  • 可持久化线段树
  • 其他可持久化数据结构

2.3.3 算法

1. 算法策略
  • 分块
  • 离线处理思想
  • 复杂分治思想
  • 平衡规划思想
  • 构造思想
2. 字符串算法
  • 扩展KMP算法
  • 有穷自动机的概念
  • AC自动机
  • 后缀数组
  • 后缀树
  • 后缀自动机
3. 图论算法
  • 基环树
  • 最小树形图
  • 2-SAT
  • 网络流
  • 图的支配集、独立集与覆盖集
  • 匈牙利算法
  • KM算法
  • 一般图的匹配
4. 动态规划
  • 复杂动态规划模型的构建
  • 复杂动态规划模型的优化

2.3.4 数学与其他

1. 初等数论
  • 原根和指数
  • 大步小步 (Baby Step Giant Step, BSGS) 算法
  • 狄利克雷(Dirichlet)卷积
  • 二次剩余
  • 二次同余式
2. 离散与组合数学
  • 群及其基本性质
  • 置换群与循环群
  • 母函数
  • 莫比乌斯反演
  • Burnside 引理与 Pólya 定理
  • 斯特林(Stirling)数
  • 无根树的 Prüfer 序列
3. 线性代数
  • 逆矩阵
  • 行列式
  • 向量空间与线性相关
4. 高等数学
  • 多项式函数的微分
  • 多项式函数的积分
  • 泰勒(Taylor)级数
  • 快速傅里叶变换
5. 概率论
  • 概率的基本概念
  • 随机变量的期望与方差
  • 条件概率
  • 贝叶斯公式
6. 博弈论
  • 尼姆(Nim)博弈
  • SG 函数
7. 最优化
  • 单纯形法
8. 计算几何
  • 点、线、面之间位置关系的判定
  • 一般图形面积的计算
  • 二维凸包
  • 半平面交
9. 信息论
  • 熵、互信息、条件熵、相对熵
10. 其他
  • 信息复杂度的概念
  • 描述复杂度的概念
  • 通讯复杂度的概念