NOI 竞赛大纲
upd:2023.3.15 最新版:NOI 大纲(2023年修订版)正式发布
建议在各级别竞赛题目的命制中,
(1)各级别竞赛或活动的考察范围不超过对应的大纲级别,其中难度系数为 10 的知识点仅用于 CTS;
(2)避免对算法复杂度的常系数的考察;
(3)部分单个知识点可能对应不同层次、不同性能的多个数据结构或算法。考察内容应以常见的、经典的内容为主,避免虽具有微弱性能优势(例如算法复杂度的细微改进)但较为冷僻或过新的数据结构和算法。
「NOI 大纲」
【X】表示难度系数
入门级难度系数范围取 1-5
提高级难度系数范围取 5-8
NOI 级难度系数范围取 7-10
1 入门级
1.1 计算机基础与编程环境
- 【1】计算机的基本构成(CPU、内存、I/O 设备等)
- 【1】Windows、Linux 等操作系统的基本概念及其常见操作
- 【1】计算机网络和 Internet 的基本概念
- 【1】计算机的历史和常见用途
- 【1】NOI 以及相关活动的历史
- 【1】NOI 以及相关活动的规则
- 【1】位、字节与字
- 【1】程序设计语言以及程序编译和运行的基本概念
- 【1】使用图形界面新建、复制、删除、移动文件或目录
- 【1】使用 Windows 系统下的集成开发环境(例如 Dev C++ 等)
- 【1】使用 Linux 系统下的集成开发环境(例如 Code::Blocks 等)
- 【1】g++、gcc 等常见编译器的基本使用
1.2 C++ 程序设计 1
1. 程序基本概念
- 【1】标识符、关键字、常量、变量、字符串、 表达式的概念
- 【1】常量与变量的命名、定义及作用
- 【2】头文件与名字空间的概念
- 【2】编辑、编译、解释、调试的概念
2. 基本数据类型
- 【1】整数型:
int
,long long
- 【1】实数型:
float
,double
- 【1】字符型:
char
- 【1】布尔型:
bool
3. 程序基本语句
- 【2】
cin
语句,scanf
语句,cout
语句,printf
语句,赋值语句,复合语句 - 【2】
if
语句,switch
语句,多层条件语句 - 【2】
for
语句,while
语句,do while
语句 - 【3】多层循环语句
4. 基本运算
- 【1】算数运算:加、减、乘、除、整除、求余
- 【1】关系运算:大于,大于等于,小于,小于等于,等于,不等于
- 【1】逻辑运算:与(
&&
)、或(||
)、非(!
) - 【1】变量自增与自减运算
- 【1】三目运算
- 【2】位运算:与(
&
)、或(|
)、非(~
)、 异或(^
)、左移(<<
)、右移(>>
)
5. 数学库常用函数
- 【3】绝对值函数,四舍五入函数,下取整函数, 上取整函数,平方根函数,常用三角函数,对数函数,指数函数
6. 结构化程序设计
- 【1】顺序结构、分支结构和循环结构
- 【2】自顶向下、逐步求精的模块化程序设计
- 【2】流程图的概念及流程图描述
7. 数组
- 【1】数组与数组下标
- 【1】数组的读入与输出
- 【3】二维数组与多维数组
8. 字符串的处理
- 【2】字符数组与相关函数
- 【2】
string
类与相关函数
9. 函数与递归
- 【2】函数定义与调用,形参与实参
- 【3】传值参数与传引用参数
- 【2】常量与变量的作用范围
- 【2】递归函数
10. 结构体与联合体
- 【3】结构体
- 【3】联合体
11. 指针类型
- 【4】指针
- 【4】基于指针的数组访问
- 【4】字符指针
- 【4】指向结构体的指针
12. 文件及基本读写
- 【2】文件的基本概念,文本文件的基本操作
- 【2】文本文件类型与二进制文件类型
- 【2】文件重定向、文件读写等操作
13. STL 模板应用
- 【3】算法模板库中的函数:
min
,max
,swap
,sort
- 【4】栈(
stack
)、 队列(queue
)、链表(list
)、向量(vector
)等容器
1.3 数据结构
1. 线性结构
- 【3】链表:单链表、双向链表、循环链表
- 【3】栈
- 【3】队列
2. 简单树
- 【3】树的定义及其相关概念
- 【4】树的表示与存储
- 【3】二叉树的定义与基本性质
- 【4】二叉树的表示与存储
- 【4】二叉树的遍历:前序、中序、后序
3. 特殊树
- 【4】完全二叉树的定义与基本性质
- 【4】完全二叉树的数组表示法
- 【4】哈夫曼树的定义和构造,哈夫曼编码
- 【4】二叉搜索树的定义和构造
4. 简单图
- 【3】图的定义与相关概念
- 【4】图的表示与存储:邻接矩阵
- 【4】图的表示与存储:邻接表
1.4 算法
1. 算法概念与描述
- 【1】算法概念
- 【2】算法描述:自然语言描述、流程图描述、伪代码描述
2. 入门算法
- 【1】枚举法
- 【1】模拟法
3. 基础算法
- 【3】贪心法
- 【3】递推法
- 【4】递归法
- 【4】二分法
- 【4】倍增法
4. 数值处理算法
- 【4】高精度的加法
- 【4】高精度的减法
- 【4】高精度的乘法
- 【4】求高精度整数除以单精度整数的商和余数
5. 排序算法
- 【3】排序的基本概念(稳定性等)
- 【3】冒泡排序
- 【3】选择排序
- 【3】插入排序
- 【3】计数排序
6. 搜索算法
- 【5】深度优先搜索
- 【5】广度优先搜索
6. 图论算法
- 【4】深度优先遍历
- 【4】宽度优先遍历
- 【5】泛洪算法(flood fill)
7. 动态规划
- 【4】动态规划的基本思路
- 【4】简单一维动态规划
- 【5】简单背包类型动态规划
- 【5】简单区间类型动态规划
1.5 数学与其他
1. 数及其运算
- 【1】自然数、整数、有理数、实数及其算术运算(加、减、乘、除)
- 【1】进制与进制转换:二进制、八进制、十进制、十六进制
2. 初等数学
- 【1】代数(初中部分)
- 【1】几何(初中部分)
3. 初等数论
- 【3】整除、因数、倍数、指数、质(素)数、合数
- 【3】取整
- 【3】模运算与同余
- 【3】整数唯一分解定理
- 【3】辗转相除法(欧几里得算法)
- 【4】素数筛法:埃氏筛法与线性筛法
4. 离散与组合数学
- 【2】集合
- 【2】加法原理
- 【2】乘法原理
- 【4】排列
- 【4】组合
- 【4】杨辉三角
5. 其他
- 【2】ASCII 码
- 【2】格雷码
2 提高级
2.1 基础知识与编程环境
- 【5】在 Linux 系统终端中使用
mkdir
、cp
、rm
、mv
等命令新建、复制、删除、移动文件或目录 - 【5】在 Linux 系统终端中使用
cd
、pwd
、ls
等命令更改、显示目录路径和查看目录中的文件 - 【5】在 Linux 系统下使用 Gedit、Vim 或 Emacs 等文本编辑工具编写代码
- 【5】熟悉 g++、gcc 等编译器以及优化、数学库等常见编译选项
- 【5】在 Linux 系统终端中运行程序,并使用
time
命令查看程序用时(区分real time
、sys time
和user time
) - 【5】了解调试工具 gdb 及其
break
、display
、continue
、step
等命令
2.2 C++ 程序设计
1. 类(class
)
- 【6】类的概念及简单应用
- 【6】成员函数和运算符重载
2. STL 模板
- 【5】容器(
container
)和迭代器(iterator
) - 【5】对(
pair
),元组(tuple
) - 【5】集合(
set
),多重集合(multiset
) - 【5】双端队列(
deque
),优先队列(priority_queue
) - 【5】映射(
map
),多重映射(multimap
) - 【5】算法模板库中的常用函数
2.3 数据结构
1. 线性结构
- 【5】双端栈
- 【5】双端队列
- 【5】单调队列
- 【6】优先队列
- 【6】ST 表(Sparse Table)
2. 集合与森林
- 【6】并查集
- 【6】树的孩子兄弟表示法
3. 特殊树
- 【6】二叉堆
- 【6】树状数组
- 【6】线段树
- 【6】字典树(Trie 树)
- 【7】笛卡尔树
- 【8】平衡树: AVL、treap、splay 等
4. 常见图
- 【5】稀疏图
- 【6】偶图(二分图)
- 【6】欧拉图
- 【6】有向无环图
- 【7】连通图与强连通图
- 【7】双连通图
5. 哈希表
- 【5】数值哈希函数构造
- 【6】字符串哈希函数构造
- 【6】哈希冲突的常用处理方法
2.4 算法
1. 复杂度分析
- 【6】时间复杂度分析
- 【6】空间复杂度分析
2. 算法策略
- 【6】离散化
3. 基础算法
- 【6】分治算法
4. 排序算法
- 【5】归并排序
- 【5】快速排序
- 【6】堆排序
- 【5】桶排序
- 【6】基数排序
5. 字符串相关算法
- 【5】字符串匹配:KMP 算法
6. 搜索算法
- 【6】搜索的剪枝优化
- 【6】记忆化搜索
- 【7】启发式搜索
- 【7】双向广度优先搜索
- 【7】迭代加深搜索
7. 图论算法
- 【6】最小生成树:Prim 和 Kruskal 等算法
- 【7】次小生成树
- 【6】单源最短路:Bellman-Ford、Dijkstra、SPFA 等算法
- 【7】单源次短路
- 【6】Floyd-Warshall 算法
- 【6】有向无环图的拓扑排序
- 【6】欧拉道路和欧拉回路
- 【6】二分图的判定
- 【7】强联通分量
- 【7】割点、割边
- 【6】树的中心、直径、DFS 序与欧拉序
- 【6】树上差分、子树和与倍增
- 【6】最近公共祖先
8. 动态规划
- 【6】树型动态规划
- 【7】状态压缩动态规划
- 【8】动态规划的常用优化
2.5 数学
1. 初等数学
- 【5】代数(高中部分)
- 【6】几何(高中部分)
2. 初等数论
- 【5】同余式
- 【7】欧拉定理和欧拉函数
- 【7】费马小定理
- 【7】威尔逊定理
- 【7】裴蜀定理
- 【7】模意义下的乘法逆元
- 【7】扩展欧几里得算法
- 【7】中国剩余定理
3. 离散与组合数学
- 【6】多重集合
- 【6】等价类
- 【6】多重集上的排列
- 【6】多重集上的组合
- 【6】鸽巢原理
- 【6】二项式定理
- 【7】容斥原理
- 【7】卡特兰(Catalan)数
4. 线性代数
-
【5】向量与矩阵的概念
-
【6】向量的运算
-
【6】矩阵的初等变换
-
【6】矩阵的运算:加法、减法、乘法与转置
-
【6】特殊矩阵的概念:单位阵、三角阵、对称阵和稀疏矩阵
-
【7】高斯消元法
3 NOI 级
3.1 C++ 程序设计
- 【8】面向对象的程序设计思想(OOP)
3.2 数据结构
1. 线性结构
- 【8】块状链表
2. 序列
- 【9】跳跃表
3. 复杂树
- 【8】树链剖分
- 【10】动态树:LCT
- 【8】二维线段树
- 【9】树套树
- 【9】k-d 树
- 【10】虚树
4. 可合并堆
- 【8】左偏树
- 【10】二项堆
5. 可持久化数据结构
- 【8】可持久化线段树
- 【9】其他可持久化数据结构
3.3 算法
1. 算法策略
- 【8】分块
- 【8】离线处理思想
- 【9】复杂分治思想
- 【9】平衡规划思想
- 【9】构造思想
2. 字符串算法
-
【8】Manacher 算法
-
【9】扩展 KMP 算法
-
【8】有穷自动机
-
【8】AC 自动机
-
【8】后缀数组
-
【9】后缀树
-
【10】后缀自动机
3. 图论算法
- 【8】奇环树
- 【10】最小树形图
- 【8】2-SAT
- 【8】网络流
- 【10】图的支配集、独立集与覆盖集
- 【8】匈牙利算法
- 【9】KM 算法
- 【10】一般图的匹配
4. 动态规划
- 【9】复杂动态规划模型的构建
- 【9】复杂动态规划模型的优化
3.4 数学与其他
1. 初等数论
- 【8】原根和指数
- 【8】大步小步(Baby Step Giant Step,BSGS)算法
- 【9】狄利克雷(Dirichlet)卷积
- 【10】二次剩余
- 【10】二次同余式
2. 离散与组合数学
-
【9】群及其基本性质
-
【9】置换群与循环群
-
【9】母函数
-
【9】莫比乌斯反演
-
【9】Burnside 引理与 Pólya 定理
-
【9】斯特林(Stirling)数
-
【9】无根树的 Prüfer 序列
3. 线性代数
- 【9】逆矩阵
- 【9】行列式
- 【9】向量空间与线性相关
4. 高等数学
- 【8】多项式函数的微分
- 【8】多项式函数的积分
- 【10】泰勒(Taylor)级数
- 【10】快速傅里叶变换(Fast Fourier Transform,FFT)
5. 概率论
- 【8】概率的基本概念
- 【10】随机变量的期望与方差
- 【9】条件概率
- 【9】贝叶斯公式
6. 博弈论
- 【9】Nim 博弈
- 【9】SG 函数
7. 最优化
- 【10】单纯形法
8. 计算几何
- 【8】点、线、面之间位置关系的判定
- 【8】一般图形面积的计算
- 【8】二维凸包
- 【9】半平面交
9. 信息论
- 【10】熵、互信息、条件熵、相对熵
10. 其他
- 【10】信息复杂度的概念
- 【10】描述复杂度的概念
- 【10】通讯复杂度的概念
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具