🌑

Hi Folks.

cpp教学大纲-CSP-S复赛

CSP-S(提高级)复赛为上机编程,4道题,限时4小时。知识点覆盖难度系数5~8级,在CSP-J全部知识点基础上新增以下内容。算法相关知识点占比最大(约47.2%),其次为数据结构和数学。复赛注重算法思维、代码实现与复杂度优化。

  1. 竞赛环境与代码规范(复赛深化)
    1.1 Linux系统下的文件操作(绝对路径与相对路径)
    1.2 Linux终端中编译与运行(g++ -o program program.cpp -O2 -std=c++17
    1.3 Linux下使用time命令测量程序运行时间
    1.4 GDB调试器的基本使用(breakrunnextstepprintbacktrace
    1.5 大型数组必须开在全局/静态区(防止栈溢出)
    1.6 多组输入数据时的EOF判断(while(scanf(...) != -1)
    1.7 文件输入输出重定向(freopen的写法与注意事项)
    1.8 内存限制换算(256MB约可开$6.7 \times 10^7$个int
    1.9 递归深度限制(约$10^5$层可能爆栈,考虑迭代或增大栈空间)
    1.10 关闭同步流(ios::sync_with_stdio(false))的时机与副作用

  2. C++高级特性与STL(复赛应用)
    2.1 类(class)的定义与使用
    2.2 运算符重载(用于结构体/类的比较、排序)
    2.3 函数对象(仿函数)与lambda表达式在sort中的应用
    2.4 setmultiset的有序去重与查找($O(\log n)$)
    2.5 mapmultimap的键值对存储与遍历
    2.6 unordered_setunordered_map的哈希存储($O(1)$平均)
    2.7 deque双端队列的用法(push_frontpop_frontpush_backpop_back
    2.8 priority_queue优先队列(默认大根堆,greater<T>为小根堆)
    2.9 bitset位集合的操作与优化(空间压缩为1/8)
    2.10 tuple元组(C++11)与pair的对比
    2.11 STL算法中的自定义比较函数(cmp与lambda)
    2.12 STL算法中的函数对象(greaterlessplus等)

  3. 数据结构进阶
    3.1 单调栈(求下一个更大/更小元素,$O(n)$)
    3.2 单调队列(滑动窗口最值,$O(n)$)
    3.3 并查集的路径压缩与按秩合并(时间复杂度接近$O(\alpha(n))$)
    3.4 带权并查集(维护节点到根的距离/关系)
    3.5 可持久化并查集的基本思想
    3.6 二叉堆的手写实现(上滤、下滤、建堆)
    3.7 ST表(Sparse Table)解决RMQ问题($O(n \log n)$预处理,$O(1)$查询)
    3.8 树状数组(Fenwick Tree)支持单点修改+前缀查询
    3.9 树状数组的扩展(区间修改+单点查询、区间修改+区间查询)
    3.10 线段树的基本结构(递归建树、单点修改、区间查询)
    3.11 线段树的懒标记(Lazy Propagation)实现区间修改
    3.12 线段树的动态开点(处理大范围离散化)
    3.13 链式前向星(用数组模拟邻接表,竞赛常用)
    3.14 树的DFS序与欧拉序(将子树转化为区间)
    3.15 树链剖分(轻重链剖分,将树路径转化为区间)
    3.16 笛卡尔树(Treap/平衡树思想)
    3.17 可持久化线段树(主席树)的基本思想
    3.18 哈希表的手写实现(开放定址法、链地址法)

  4. 搜索进阶
    4.1 DFS的剪枝优化(可行性剪枝、最优性剪枝、上下界剪枝)
    4.2 记忆化搜索(DFS+备忘录,本质是DP)
    4.3 双向BFS(从起点和终点同时搜索,减少状态数)
    4.4 迭代加深搜索(IDS,结合DFS的空间与BFS的完备性)
    4.5 IDA(迭代加深+A估价函数)
    4.6 A*算法的基本原理($f = g + h$,可采纳启发函数)
    4.7 状态压缩BFS(用整数表示状态,位运算加速)

  5. 图论算法
    5.1 最短路算法对比(Dijkstra、SPFA、Floyd的适用场景与复杂度)
    5.2 Dijkstra算法的堆优化($O(m \log n)$)
    5.3 Dijkstra处理负权边的问题(不能处理负权)
    5.4 SPFA(队列优化的Bellman-Ford,处理负权、判负环)
    5.5 Floyd-Warshall(全源最短路,$O(n^3)$,可判负环)
    5.6 差分约束系统(最短路/最长路建模)
    5.7 最小生成树的两种算法(Prim $O(n^2)$ / 堆优化$O(m \log n)$,Kruskal $O(m \log m)$)
    5.8 Kruskal重构树的基本思想
    5.9 拓扑排序的两种实现(Kahn算法、DFS后序)
    5.10 拓扑排序判断有向图是否有环
    5.11 欧拉路径与欧拉回路的Hierholzer算法
    5.12 强连通分量(Tarjan算法,求SCC)
    5.13 强连通分量缩点(将原图转化为DAG)
    5.14 割点与割边的判定(Tarjan算法,low[]dfn[]
    5.15 点双连通分量与边双连通分量
    5.16 二分图的判定(染色法)
    5.17 二分图最大匹配(匈牙利算法,增广路思想)
    5.18 最近公共祖先(LCA)的倍增法($O(\log n)$查询)
    5.19 LCA的Tarjan离线算法(并查集+DFS)
    5.20 树的重心与树的直径的求法
    5.21 树上差分(点差分、边差分)
    5.22 子树和与树上倍增
    5.23 同余最短路(模意义下的最短路建模)

  6. 动态规划进阶
    6.1 DP的优化方法总览(空间优化、时间优化)
    6.2 滚动数组优化空间(只保留前两维/前一维)
    6.3 树形DP(树上最大独立集、树上最小点覆盖、树上背包)
    6.4 树形DP换根(二次扫描,求所有节点的答案)
    6.5 区间DP(石子合并、矩阵链乘、括号匹配)
    6.6 区间DP的四边形不等式优化($O(n^3) \rightarrow O(n^2)$)
    6.7 数位DP(按位统计,状态设计,记忆化搜索实现)
    6.8 状态压缩DP(旅行商问题TSP,集合覆盖)
    6.9 状态压缩DP的优化(预处理合法状态、转移)
    6.10 多维动态规划
    6.11 斜率优化DP(维护凸包,单调队列优化)
    6.12 四边形不等式优化DP(区间DP的决策单调性)
    6.13 单调队列优化DP(滑动窗口最值加速转移)
    6.14 数据结构优化DP(线段树/树状数组维护区间最值)
    6.15 矩阵快速幂优化DP递推(线性递推加速)

  7. 字符串算法
    7.1 KMP算法(前缀函数$\pi[i]$,next数组求法,$O(n+m)$匹配)
    7.2 KMP的next数组理解与应用(循环节、最小周期)
    7.3 字符串哈希(滚动哈希,双哈希防冲突)
    7.4 Manacher算法(求最长回文子串,$O(n)$)
    7.5 Trie树(字典树,插入、查找、前缀统计)
    7.6 Trie树的应用(自动补全、异或最大对)
    7.7 AC自动机(多模式串匹配,Trie树+KMP思想)
    7.8 后缀数组(SA)的基本概念
    7.9 后缀自动机(SAM)的基本概念
    7.10 扩展KMP(Z Algorithm,$O(n)$求每个后缀与前缀的LCP)

  8. 算法策略
    8.1 扫描线算法
    8.2 扫描线求矩形面积并/周长并
    8.3 扫描线在三维/多维问题中的扩展
    8.4 分块算法(根号平衡,大块维护+小块暴力)
    8.5 莫队算法(离线区间查询,$O((n+q)\sqrt{n})$)
    8.6 带修莫队(支持单点修改的区间查询)
    8.7 整体二分(离线解决多个二分答案问题)
    8.8 CDQ分治(偏序问题,分治+数据结构)
    8.9 倍增法在各类问题中的应用(LCA、RMQ、树上跳)

  9. 数学进阶
    9.1 扩展欧几里得算法(exgcd,解$ax+by=\gcd(a,b)$)
    9.2 模逆元的三种求法(扩展欧几里得、费马小定理、线性递推)
    9.3 中国剩余定理(CRT,模数互质)
    9.4 扩展中国剩余定理(EXCRT,模数不互质)
    9.5 欧拉函数的线性筛法(同时筛质数与欧拉函数)
    9.6 快速幂($O(\log n)$求$a^b \bmod p$)
    9.7 矩阵快速幂(加速线性递推,如斐波那契)
    9.8 高斯消元法(解线性方程组,$O(n^3)$)
    9.9 高斯消元求矩阵的秩
    9.10 线性基(求异或空间的最大值/第k小)
    9.11 组合数取模(Lucas定理,预处理阶乘与逆元)
    9.12 容斥原理在计数问题中的应用
    9.13 卡特兰数的递推与通项公式
    9.14 离散随机变量的期望与方差

  10. 贪心与构造
    10.1 贪心正确性的严格证明(交换论证、反证法、归纳法)
    10.2 排序贪心的经典模型(区间调度、任务安排)
    10.3 优先队列贪心的经典模型(合并果子、哈夫曼编码)
    10.4 二分答案+贪心检验(最大化最小值/最小化最大值)
    10.5 构造题的基本思路(特殊化、归纳构造、调整法)
    10.6 构造题的输出格式与方案验证

  11. 时间复杂度与空间复杂度分析(复赛关键)
    11.1 数据范围与算法选择的对应关系($n \le 20$→状压/搜索,$n \le 5000$→$O(n^2)$,$n \le 10^5$→$O(n \log n)$,$n \le 10^6$→$O(n)$)
    11.2 常数优化技巧(位运算替代乘除、循环展开、减少取模)
    11.3 内存占用的精确计算(int 4B、long long 8B、bool 1B、指针8B)
    11.4 递归栈空间的风险评估
    11.5 多组测试数据的总复杂度计算

  12. 代码调试与对拍技巧
    12.1 中间结果输出调试法(printf/cout打印关键变量)
    12.2 断言(assert)的使用
    12.3 小数据对拍(随机生成+暴力验证)
    12.4 边界数据的构造与测试($n=0$、$n=1$、最大值)
    12.5 极端数据的压力测试(内存与时间)
    12.6 静态查错(逐行阅读,检查变量名、数组大小、循环边界)

— 2026年7月15日


Search