GESP C++ 八级真题分类整理:组合数学、倍增、图论与算法优化

四季读书网 2 0
GESP C++ 八级真题分类整理:组合数学、倍增、图论与算法优化

GESP C++ 八级已经进入 GESP 体系中的最高等级,题目不再只是“会用某个模板”,而是更强调:

  • 能否从题意中抽象出数学模型;
  • 能否用组合计数快速计算方案数;
  • 能否使用倍增处理大步移动或快速跳转;
  • 能否掌握最短路、最小生成树等基础图论算法;
  • 能否分析复杂度并做必要优化。

按照 GESP 八级考纲,八级重点包括计数原理、排列组合、杨辉三角、倍增法、代数与平面几何、最小生成树、单源最短路、Floyd,以及较复杂算法的时间空间复杂度分析和算法优化。

从真题来看,八级题目主要集中在:

  • 组合数学与排列计数;
  • 树上倍增、LCA、树上路径;
  • Dijkstra、Floyd、最小生成树;
  • 图论建模与连通性;
  • 贪心、双指针、栈模拟;
  • 子图枚举、区间最短路;
  • 大数据范围下的复杂度优化。

一、组合数学与计数问题

八级最明显的特点之一,就是组合计数题变多。

这类题通常不难理解题意,但如果直接暴力枚举,会很快超时。学生需要熟悉阶乘、逆元、组合数、排列数,以及“先选对象,再排顺序”的计数思路。

1. 多重集合分配

  • P10112 [GESP202312 八级] 奖品分配

题目给出  名同学和  种奖品,第  种奖品有  个。每位同学恰好分到一个奖品,且奖品总数为  或 ,要求分配方案数。

如果奖品总数刚好是 ,那么就是多重集合排列:

如果奖品总数是 ,说明会剩下一个奖品。可以枚举剩下的是哪一种奖品,然后把该种奖品数量减一,再计算方案数。

重点:

  • 阶乘和逆元(要了解)预处理;
  • 多重集合排列公式;
  • 总数为  时枚举剩余奖品;
  • 取模计算;
  • 多组数据下要注意复杂度。

这题是八级组合数学的入门题。

2. 组合选择与配对计数

  • P11250 [GESP202409 八级] 手套配对

题目有  对手套,每对分左右两只。从中取出  只,要求恰好包含  对完整手套,求方案数。(洛谷)

思路可以分三步:

  1. 先从  对中选出  对完整手套;
  2. 剩余还需要取  只单只手套;
  3. 这些单只手套必须来自剩下的  对,并且每对最多取一只,每对有左手或右手两种选择。

因此核心公式是:

重点:

  • “完整一对”和“单只手套”分开处理;
  • 选择完整对数;
  • 选择贡献单只手套的若干对;
  • 每一对单只手套有  种选择;
  • 需要处理不合法情况,例如  或 

这是非常标准的组合计数题。

3. 相邻限制与排列计数

  • P11380 [GESP202412 八级] 排队

题目给出  位同学和  对相邻关系,关系  表示  必须排在  前面且二者相邻,要求总排队方案数。数据范围达到 

这题本质是把若干相邻关系压缩成“链”。

如果某个同学后面必须接多个人,或者前面必须接多个人,就不合法。

如果关系形成环,也不合法。

否则每条链可以看成一个整体,与单独的人一起排列。

假设压缩后共有  个整体,则答案为:

重点:

  • 每个点最多有一个后继;
  • 每个点最多有一个前驱;
  • 检查是否出现环;
  • 把链压缩成整体;
  • 最后对整体数量做阶乘。

这题适合训练“限制关系转图,再转计数”的能力。

4. DFS 遍历序计数

  • P13020 [GESP202506 八级] 遍历计数

题目给出一棵树,DFS 的起点可以任意选择,每个点访问相邻点的顺序也可以任意,要求不同 DFS 遍历序的数量。答案对  取模。

这题看起来像搜索,实际上是树上计数。

确定根后,每个点的若干子树可以按照任意顺序访问,贡献一个阶乘。

如果起点不同,得到的遍历序也可能不同,需要综合统计。

重点:

  • 树上 DFS 的访问序由相邻点顺序决定;
  • 每个点的分支顺序有阶乘贡献;
  • 起点可以任意选择;
  • 答案可能极大,需要取模;
  • 取模是 ,不是常见的 

这题是八级中比较典型的“树结构 + 计数”题。

二、树上问题与倍增思想

八级考纲明确包含倍增法。真题中虽然不一定都直接写“倍增”,但大量题目需要处理树上路径、祖先、快速移动和大步跳转。

1. 多人共同领导

  • P10113 [GESP202312 八级] 大量的工作沟通

公司结构是一棵以  为根的有根树。每次询问给出若干员工,要求找到能够管理所有参与员工且编号最大的员工。

这就是求多个点的最近公共祖先。

重点:

  • 公司上下级关系抽象成有根树;
  • 能管理所有人的编号最大员工,就是这些点的 LCA;
  • 可以用倍增预处理祖先;
  • 多个点的 LCA 可以两两合并;
  • 注意根节点编号为 

这题是八级 LCA 入门题。

2. 树上最远异色点对

  • P10725 [GESP202406 八级] 最远点对

题目给出一棵树,每个点为黑色或白色,要求相距最远的一对不同颜色点的距离。(洛谷)

常见思路:

  • 从某个颜色点出发找最远的异色点;
  • 或分别维护黑点、白点的树上直径信息;
  • 也可以通过两次 DFS / 树形 DP 合并答案。

重点:

  • 树上距离;
  • 树的直径思想;
  • 不同颜色限制;
  • 子树信息合并;
  • ,不能枚举所有点对。

这题适合放在“树上距离与直径”专题。

3. 最长交替颜色路径

  • P11251 [GESP202409 八级] 美丽路径

树上每个点是黑色或白色,一条路径美丽当且仅当相邻节点颜色均不同,要求最长美丽路径长度。(洛谷)

如果把所有连接同色节点的边删除,剩下的每个连通块中任意路径都满足相邻颜色不同。

所以问题可以转化为:

在删去同色边后的森林中,求最大连通块的直径节点数。

重点:

  • 同色边不能出现在美丽路径中;
  • 保留异色边形成森林;
  • 在每个连通块中求直径;
  • 或用树形 DP 求最长链;
  • 路径长度按节点数量计算,不是边数。

这题是树上路径 DP 的经典变形。

4. 黑点数量限制下的最长路径

  • P11379 [GESP202412 八级] 树上移动

题目要求在树上选择一条简单路径,使路径上经过的黑色节点不超过 ,并最大化经过节点数。数据范围 

由于数据范围不大,可以从每个点出发 DFS,统计路径上黑点数量和长度。

也可以把它作为“树上双指针 / 树上路径枚举”的训练题。

重点:

  • 路径不能重复节点;
  • 约束是黑点数量;
  •  允许较高复杂度;
  • 可以枚举起点进行 DFS;
  • 注意路径长度按节点数计算。

5. 树上快速移动

  • P13019 [GESP202506 八级] 树上旅行

题目给出一棵有根树,移动有两类:向父亲移动若干步,或向编号最小的儿子移动若干步。移动次数可能很大,询问总规模较大。

向父亲走多步,是典型的倍增跳祖先。

向编号最小的儿子不断走,相当于沿着每个点的“最小儿子链”向下移动,也可以预处理倍增跳转。

重点:

  • 父亲方向用倍增;
  • 最小儿子方向也可以看成函数图上的倍增;
  • 每段移动次数可能很大,不能一步步走;
  • 需要处理到根或叶子后不再移动;
  • 总 ,每段  可通过。

这是八级倍增专题非常好的题。

三、最短路与图论算法

八级考纲明确要求最短路与最小生成树。真题中图论题的难度明显高于七级,很多题会结合附加条件或多次询问。

1. 单源最短路

  • P11966 [GESP202503 八级] 上学

给定一张带权无向图,学校在点 ,有  个同学询问从家到学校的最短时间。边权均为正。

因为所有询问终点相同,直接从学校  做一次 Dijkstra,就能得到所有点到学校的最短距离。

重点:

  • 带权图不能用 BFS;
  • 多个询问同一个目标点,可以反向思考;
  • 无向图中从学校出发等价于所有点到学校;
  • Dijkstra + 优先队列;
  • 距离要用 long long

这是八级单源最短路基础题。

2. 巨大完全图上的最短距离

  • P14079 [GESP202509 八级] 最短距离

题目构造了一个含  个结点的带权无向图,若两个结点编号互质则边权为 ,不互质则边权为 ,多次询问两点之间最短距离。题目给出的询问规模为 ,点编号可达 

显然不能建图。

这类题的关键是利用数学性质压缩路径长度。

重点:

  • 图极大,不能建边;
  • 判断两数是否互质;
  • 直接边权由  决定;
  • 可能通过中间点获得更短距离;
  • 需要用数论性质分析最短路径只需考虑少数情况。

这题是“数学图论建模”的代表题。

3. 猫和老鼠

  • P14923 [GESP202512 八级] 猫和老鼠

庄园是一张带权连通无向图。猫从猫窝出发,老鼠从某点逃往老鼠洞。若老鼠能规划一条路径,使路径上每个点猫到达时间都严格大于老鼠到达时间,则这个点是安全的,要求安全点奶酪价值和。

核心思路:

  • 先从猫窝做 Dijkstra,求猫到每个点的最短时间;
  • 再从老鼠洞反向做 Dijkstra 或类似最短路扩展;
  • 只有满足“老鼠到达时间 < 猫到达时间”的点才可能安全;
  • 安全路径必须整条路径都满足严格不等式。

重点:

  • 两次最短路;
  • 严格小于条件;
  • 从终点反向扩展更自然;
  • 点权求和;
  • 边权和答案都要用 long long

这题非常适合训练“最短路 + 安全区域判定”。

4. 子图最短路

  • P15805 [GESP202603 八级] 子图最短路

给定带权无向图,对所有编号区间  构造诱导子图,要求统计所有子图中所有点对最短路之和,对  取模。数据范围 ,可能有重边。

这题数据范围不大,但枚举层次很多。

可以从 Floyd 的角度思考:

  • 子图由连续编号区间决定;
  • 对每个区间都重新 Floyd 会很慢;
  • 需要利用  做复杂度优化;
  • 重边要保留最小边权;
  • 不连通点对贡献 

重点:

  • Floyd 求全源最短路;
  • 区间诱导子图;
  • 多重循环复杂度估算;
  • 对  取模;
  • 注意重边和不连通。

这是八级图论综合压轴题之一。

四、最小生成树及其变形

1. 删除边后的 MST

  • P14080 [GESP202509 八级] 最小生成树

给定一张带权连通无向图。对于每条边,询问删除这条边后图的最小生成树权值和;若不存在 MST 输出 -1

如果每次删一条边重新跑 Kruskal,复杂度太高。

需要先求原图 MST,然后分类讨论:

  • 如果删除的是非 MST 边,原 MST 不受影响;
  • 如果删除的是 MST 边,需要找能替代它的最小非树边;
  • 若没有替代边,则图不连通,答案为 -1

重点:

  • Kruskal 求 MST;
  • 判断边是否在 MST 中;
  • 非树边替代树边;
  • 树上路径最大边 / 替代边维护;
  • 可结合 LCA、倍增或并查集优化。

这题是八级最小生成树专题的核心题。

五、栈、区间询问与模拟优化

1. 接竹竿

  • P10264 [GESP202403 八级] 接竹竿

给出卡牌序列,多次询问区间  按规则玩“接竹竿”后剩余几张牌。若新牌点数在队列中已出现,就把两张相同牌之间所有牌取出。

这题如果每次询问直接模拟,最坏复杂度过高。

由于点数最大只有 ,可以利用状态压缩或预处理区间转移。

重点:

  • 单次过程可以用栈模拟;
  • 点数种类很少;
  • 区间询问需要预处理;
  • 可以把当前队列状态压缩成一个状态;
  • 询问转化为状态转移。

这题是“模拟规则 + 多次询问优化”的代表题。

2. 宝石项链

  • P14924 [GESP202512 八级] 宝石项链

项链是环形的,有  种宝石。需要把项链划分成若干连续段,每段都包含全部  种宝石,求最多能划分多少段。

线性版本可以贪心:从左到右扫描,当前段集齐所有颜色后立刻切开。

环形版本则要考虑起点。

重点:

  • 每段必须包含全部颜色;
  • 线性情况下“越早切越优”;
  • 环形需要枚举或优化起点;
  • 可以使用双指针维护颜色种类;
  • 需要避免重复绕圈过度。

这题适合放在“环形序列 + 贪心/双指针”专题。

六、几何与数学建模

1. 公倍数问题

  • P10263 [GESP202403 八级] 公倍数问题

题目定义一个看不到的  矩阵,其中  是  和  的公倍数。对每个 ,问矩阵中最多有多少个位置可以是 ,最后输出加权和。

一个位置  可以填 ,当且仅当  是  和  的公倍数,也就是:

因此答案与  的约数数量有关:

  • 行编号  要是  的约数且 
  • 列编号  要是  的约数且 
  • 该  的可填位置数就是两者乘积。

重点:

  • 公倍数条件反向转化为约数条件;
  • 枚举倍数 / 约数预处理;
  • ,适合类似筛法统计;
  • 注意答案可能很大;
  • 使用 long long

这题是数论与矩阵计数结合的好题。

2. 空间跳跃

  • P10726 [GESP202406 八级] 空间跳跃

二维空间中有若干水平挡板,人物可以在挡板上左右移动,也可以从端点掉落到下方第一个挡板。求从第  个挡板左端点到第  个挡板的最短时间,可能无法到达。

可以把每个挡板看成图中的状态,左右端点掉落形成有向边,挡板上移动形成代价边。

重点:

  • 几何关系建图;
  • 从端点向下找到第一个挡板;
  • 边权包括水平移动距离和竖直掉落高度;
  • 建图后跑最短路;
  • ,可以较直接地枚举下方挡板。

这题是“几何场景转图论最短路”的代表题。

七、树上割裂与路径覆盖

1. 割裂

  • P11967 [GESP202503 八级] 割裂

给定一棵树、若干好点对和一个坏点对。删除某个点后,要求所有好点对仍连通,而坏点对不连通,求可删除节点数。

删除树上一个点会把树分成若干部分。

要让坏点对不连通,删除点必须在坏点对路径上。

要让所有好点对仍连通,删除点不能位于任何好点对路径上,也不能删掉好点对端点。

所以问题转化为:

统计坏点对路径上的点,排除所有好点对路径覆盖到的点。

重点:

  • 树上路径;
  • LCA;
  • 差分标记路径覆盖;
  • 坏路径与好路径的集合差;
  • 数据范围 ,必须线性或近线性处理。

这题是八级树上路径差分的典型题。

八、消息引用与跳转优化

1. 消息查找

  • P15804 [GESP202603 八级] 消息查找

消息编号从小到大。当前位置为  时,可以移动到 ,如果消息  引用了 ,也可以跳到 。询问从  到  的最少操作次数,且保证有引用的消息最多  条。

如果只用 ,答案是 

引用边提供了“向前跳跃”的捷径。

由于引用消息很少,可以把关键点抽出来建图或预处理。

重点:

  • 普通边是连续向前移动;
  • 引用边是额外跳跃;
  • 引用边数量少,是突破口;
  • 多次询问不能逐步模拟;
  • 可建立关键点图或预处理最短跳转。

这题是八级中非常好的“稀疏特殊边 + 查询优化”题。

按难度梯度整理

第一梯度:八级基础题

适合刚进入八级学习。

题目
主要考点
P10112 奖品分配
多重集合排列、组合数
P11250 手套配对
组合计数
P11966 上学
Dijkstra 单源最短路
P10263 公倍数问题
约数统计、筛法思想
P10725 最远点对
树上距离、直径思想
P11251 美丽路径
树上最长路径
P14924 宝石项链
环形序列、贪心、双指针

这一阶段目标是:

熟悉八级中的组合计数、树上路径和基础图论模型。

第二梯度:八级核心题

适合系统训练八级主力算法。

题目
主要考点
P10113 大量的工作沟通
LCA、倍增
P10264 接竹竿
栈模拟、状态压缩、区间询问
P10726 空间跳跃
几何建图、最短路
P11379 树上移动
树上路径、限制条件
P11380 排队
图建模、链压缩、排列计数
P11967 割裂
树上差分、路径覆盖
P13019 树上旅行
倍增跳转
P13020 遍历计数
树上计数
P15804 消息查找
稀疏跳边、最短操作查询

这一阶段基本覆盖八级的关键训练内容:倍增、树上路径、组合计数和查询优化。

第三梯度:八级提高题

适合冲刺高分和训练综合建模。

题目
主要考点
P14079 最短距离
数论图论、极大图最短路
P14080 最小生成树
MST、替代边、树上最大边
P14923 猫和老鼠
两次 Dijkstra、安全区域
P15805 子图最短路
区间子图、Floyd、复杂度优化

这些题已经明显要求不仅会模板,还要能判断“哪些信息可以预处理、哪些状态可以压缩、哪些暴力可以被数学或图论性质替代”。

按知识点专题整理

1. 组合数学专题

题目
主要考点
P10112 奖品分配
多重集合排列
P11250 手套配对
组合选择、乘法原理
P11380 排队
链压缩、整体排列
P13020 遍历计数
树上 DFS 序计数

组合数学题的重点不是背公式,而是把方案拆成若干个互不干扰的选择步骤。

2. 树上算法专题

题目
主要考点
P10113 大量的工作沟通
LCA
P10725 最远点对
树的直径
P11251 美丽路径
树上最长交替路径
P11379 树上移动
限制黑点数的路径
P11967 割裂
树上差分
P13019 树上旅行
倍增
P13020 遍历计数
树上计数

八级树题经常不是单纯 DFS,而是要结合 LCA、差分、倍增或计数。

3. 图论专题

题目
主要考点
P11966 上学
Dijkstra
P10726 空间跳跃
建图 + 最短路
P14079 最短距离
数论图论
P14080 最小生成树
Kruskal、替代边
P14923 猫和老鼠
两次最短路
P15805 子图最短路
Floyd、子图枚举

图论题的重点是:先判断图是显式图还是隐式图,再决定能不能建图。

4. 查询优化专题

题目
主要考点
P10264 接竹竿
区间询问、状态压缩
P13019 树上旅行
多次跳转、倍增
P15804 消息查找
特殊边稀疏、预处理

多次询问题一般不能每次从头模拟,要寻找可复用的信息。

八级备考建议

八级训练建议按下面顺序进行:

  1. 先练组合计数:奖品分配、手套配对、排队;
  2. 再练树上算法:大量的工作沟通、美丽路径、最远点对、割裂;
  3. 接着练倍增和查询优化:树上旅行、消息查找、接竹竿;
  4. 然后练图论:上学、空间跳跃、最小生成树、猫和老鼠;
  5. 最后练综合题:最短距离、子图最短路、遍历计数。

八级最容易出错的地方主要是:

  • 组合数预处理范围不够;
  • 忘记处理不合法计数情况;
  • LCA 倍增数组初始化错误;
  • 路径差分的端点和 LCA 处理错误;
  • Dijkstra 中距离没有用 long long
  • MST 删除边时没有区分树边和非树边;
  • 图中存在重边但没有取最小边权;
  • 取模数看错,尤其是  和 
  • 看到大数据范围仍然直接暴力模拟。

八级的核心能力可以概括为一句话:

能把题面转化为数学结构或图结构,并用预处理、倍增、组合公式或图论算法把复杂度压下来。

上一个当前已是最后一个了

下一个当前已是最新一个了

抱歉,评论功能暂时关闭!