#YDSPS2026. 2026 云斗学院软件能力认证第一轮(YDSP - Senior)提高级 C++ 语言试题
2026 云斗学院软件能力认证第一轮(YDSP - Senior)提高级 C++ 语言试题
本卷程序代码均使用原卷高分辨率截图;题号已按 Hydro 作答顺序扁平化为 1~42。
一、选择题(每题 2 分,共 30 分)
- 下列算法中,用于求最小生成树的是( )。
{{ select(1) }}
- KMP 算法
- Prim 算法
- Floyd 算法
- Tarjan 算法
- 对数组
39, 7, 36, 27, 80使用 的基数排序使得从小到大有序,第一轮结束后的结果是( )。
{{ select(2) }}
80, 36, 7, 27, 397, 27, 36, 39, 8080, 27, 36, 39, 780, 27, 36, 7, 39
- 中缀表达式
5<<4+3*2<<1等价于后缀表达式( )。
{{ select(3) }}
5 4 3 2 * + << 1 <<5 4 << 3 2 * 1 << +5 4 3 2 * + 1 << <<- 前三个答案都不对
- yummy 编译 C++ 源代码
game.cpp获得了可执行文件A。假设他希望可执行文件从文件B输入,文件C输出,并且运行时在game.cpp的main函数内填入一个参数"D",那么他在 Linux 终端里输入的命令应该是( )。
{{ select(4) }}
./A D < B > C./A D < C > B./A D B C./A < D > B C
- 考虑一个长为 2026 的字符串 ,使用 表示 中第 到 个字符构成的子串, 为最大的 使得 是回文串。如果 ,,那么 至少是( )。
{{ select(5) }}
- 20
- 50
- 60
- 前三个选项都不对
- 在一片足够空旷的平地上,一个微型机器人以“前进 1 厘米,左转 ,前进 1 厘米,左转 ,前进 1 厘米,右转 ,前进 1 厘米,右转 ”为周期运动。那么,它第一次回到起点时,运动的总路程是( )厘米。
{{ select(6) }}
- 48
- 12
- 4
- 前三个答案都不对
- 现有两个
int型变量 ,满足 。令 为 按位异或的结果, 为 的最大公因数,那么( )。
{{ select(7) }}
- ,等号可能取到。
- ,等号可能取到。
- 。
- 。
- 对于集合 ,定义 。给出函数
其中 。在不假设 的任何其他性质时,想要求解 ,下列算法中最合适的是( )。
{{ select(8) }}
- 动态规划
- 贪心法
- Dijkstra 算法
- Floyd 算法
- 一张 ()个结点、 条边的简单无向连通二分图具有欧拉回路。那么下列说法错误的是( )。
{{ select(9) }}
- 若结点 1 在左部,则有且仅有一种方法把所有结点划分为左部和右部。
- 左部和右部均至少有 2 个结点。
- 一定是偶数。
- 一定是偶数。
阅读以下材料,完成第 10 至 12 题。
维护颜色段是一个经典的问题。对于一个序列 ,如果 全部相等,并且 、(特别地,认为 ),则称 为一个颜色段。例如,1, 1, 5, 3, 3, 1 共有四个颜色段 。
现在我们需要一种数据结构:给出序列 ,需要支持区间赋值、区间数颜色段个数,且总操作次数为 次。Alice 和 Bob 选用了不同的方法。
- Alice 选择使用线段树维护序列
支持单点修改、区间求和。下列说法正确的是( )。
{{ select(10) }}
- 她写的线段树必须有懒标记(lazy-tag)。
- 这棵线段树如果使用树状数组代替,那么时间复杂度增加。
- 如果要求子串 的颜色段个数,那么需要计算序列 在 上的和。
- 使用这棵线段树,还能对于每个下标 查询它所在颜色块的右端点,但是时间复杂度为 。
- Bob 选择维护一个
set<int> s记录所有颜色段的左端点,然后每次查询时遍历区间内的颜色块实现计数,称为“珂朵莉树”。想要查询包含下标 所在的颜色块右端点 ,表达式正确的是( )。
{{ select(11) }}
r=*--s.lower_bound(i)r=*s.lower_bound(i)-1r=*--s.upper_bound(i)r=*s.upper_bound(i)-1
- Alice 和 Bob 在讨论各自做法的时间复杂度。下列说法正确的是( )。
{{ select(12) }}
- 使用 Alice 的做法,每次操作最坏 。
- 使用 Alice 的做法,总时间复杂度为 。
- 使用 Bob 的做法,每次操作最好 。
- 使用 Bob 的做法,如果输入的区间、操作类型、赋值均随机,总时间复杂度为 。
- 已知 为一个 的全排列,对任意 均有 。这样的排列 有( )种。
{{ select(13) }}
- 256
- 301
- 376
- 456
- 同余方程 有( )组解满足 。
{{ select(14) }}
- 1
- 3
- 9
- 27
- 一棵二叉树的前序遍历为
C, 1, D, 8, 4, 5, 3, A, 2, 7, 6, B,中序遍历为4, 8, D, 3, 5, 2, A, 7, 1, C, 6, B,其中 中 各出现了一次。
定义 为 的最近公共祖先。已知 ,,,那么 中,最大的数字是( )。
{{ select(15) }}
二、阅读程序(无特殊说明时判断题 1.5 分,选择题 3 分,共 40 分)
第 1 组程序(12 分)

输入数据保证:, 是长度为 的小写英文字母字符串。
- 程序输出的字符串长度取决于 的大小。
{{ select(16) }}
- 正确
- 错误
- 若将代码第 15 行
mx=0更换为mx=-1,程序的输出结果不变。
{{ select(17) }}
- 正确
- 错误
18.(2 分)若将代码第 17 行的 > 更换为 >=,程序的输出结果不变。
{{ select(18) }}
- 正确
- 错误
- 程序输出的第一个字符取决于( )。
{{ select(19) }}
- 的第一个字符。
- 的最后一个字符。
- 的最后一个字符在 中所有出现位置的下一个位置出现次数最多的字符,出现次数相同则选字典序较小者。
- 的最后一个字符在 中所有出现位置的下一个位置出现次数最多的字符,出现次数相同则选字典序较大者。
20.(4 分)若输入为 10 7 daedacbace,则输出为( )。
{{ select(20) }}
dacbacbdaedaedacbacbaaebaeba
第 2 组程序(14 分)

输入数据保证:,,,。
- 若将代码 34~37 行的整个
do-while语句替换为init();,代码的时间复杂度不变。
{{ select(21) }}
- 正确
- 错误
- 对于任何合法的输入数据,该程序输出结果不会超过 ,且可能为 。
{{ select(22) }}
- 正确
- 错误
23.(2 分)代码 34~37 行的 do-while 语句,可能导致变量 top 变为负数进而导致程序运行时错误。
{{ select(23) }}
- 正确
- 错误
24.(2 分)假设将 Find 操作的均摊时间复杂度视为 ,并且 同阶,则该算法的时间复杂度可以视为( )。
{{ select(24) }}
- 若输入为
4 5 1 2 1 2 3 1 3 4 1 4 1 0 4 1 1,则输出为( )。
{{ select(25) }}
- 1
- 2
- 3
- 4
26.(4 分)当 时,有( )种合法的输入可以使该程序输出 1。
{{ select(26) }}
- 4992
- 4896
- 5184
- 5088
第 3 组程序(14 分)

输入数据保证:, 分别是长度为 的小写英文字母字符串。
- 当字符串 为
aabaaab时,bd序列为{0,1,0,1,2,2,3}。
{{ select(27) }}
- 正确
- 错误
- 代码第 61 行的判断是没有必要的,在执行第 61 行前变量
ans不可能为负数。
{{ select(28) }}
- 正确
- 错误
29.(2 分)若 不是 的子序列,输出结果一定为 0。
{{ select(29) }}
- 正确
- 错误
30.(2 分)若删除代码第 25 行 while 循环中 x>0 的判断,程序可能出现的错误是( )。
{{ select(30) }}
- 输出答案错误(WA)
- 超出时间限制(TLE)
- 超出空间限制(MLE)
- 运行时错误(RE)
- 若输入为
3 8 csp aaacspaa,则输出为( )。
{{ select(31) }}
- 102
- 144
- 120
- 160
32.(4 分)当 时,程序输出值最大可能是( )。
{{ select(32) }}
- 249
- 251
- 253
- 255
三、完善程序(单选题,每小题 3 分,共 30 分)
组合问题(15 分)
构造一个长度为 的序列 ,每个元素都是不超过 的正整数,其中整数 恰好有 个,。
求出满足要求的不同序列数量。以下代码求解了上述问题,请补全程序。

/* Blank 1 */处应该填( )。
{{ select(33) }}
0modmod-1mod-2
/* Blank 2 */处应该填( )。
{{ select(34) }}
ifac[i]=ifac[i+1]*(i)%modifac[i]=ifac[i+1]*(i+1)%modifac[i]=ifac[i+1]*inv(i)%modifac[i]=ifac[i+1]*inv(i+1)%mod
/* Blank 3 */处应该填( )。
{{ select(35) }}
fac[x]*ifac[y]%modfac[x]*ifac[x-y]%modfac[x]*ifac[y]%mod*ifac[x-y]%modfac[x-y]*ifac[y]%mod
/* Blank 4 */处应该填( )。
{{ select(36) }}
01fac[n]ifac[n]
/* Blank 5 */处应该填( )。
{{ select(37) }}
(ans*=C(sum,x[i]))%=mod(ans+=C(sum,x[i]))%=mod(ans*=C(sum+x[i],x[i]))%=mod(ans+=C(sum+x[i],x[i]))%=mod
边权差最短路(15 分)
给定一个含 个点、 条边的带权无向图,边权为整数,起点为 1,终点为 ,保证至少存在一条从 1 到 的路径。
对于一条从起点到终点的路径,定义该路径的花费为:将经过的所有边权按顺序写下来后,该序列相邻元素差的绝对值之和。求从 1 到 的最小总费用。
以下代码求解了上述问题,请补全程序。

/* Blank 1 */处应该填( )。
{{ select(38) }}
pos<_.pospos>_.posdis<_.disdis>_.dis
/* Blank 2 */处应该填( )。
{{ select(39) }}
e[i][j].dis-e[i][j+1].dise[i][j+1].dis-e[i][j].dise[i][j].dise[i][j].dis+e[i][j+1].dis
/* Blank 3 */处应该填( )。
{{ select(40) }}
1mm+1m+2
/* Blank 4 */处应该填( )。
{{ select(41) }}
vis[u]==1dis[u]==infu>nu>m
/* Blank 5 */处应该填( )。
{{ select(42) }}
dis[n]dis[m]dis[m+1]dis[m+2]