- admin 的博客
全国青少年信息学奥林匹克系列竞赛大纲 (2025年修订版)
- @ 2025-10-16 11:23:14
全国青少年信息学奥林匹克系列竞赛大纲 (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. 其他
- 信息复杂度的概念
- 描述复杂度的概念
- 通讯复杂度的概念