「CSP-S 2021」初赛解析
-
前言
My blog。
谢谢,非常自闭,感觉没脸人见了。错一堆傻逼的不该错的。
写完解析我觉得我更蠢了怎么办。
感谢同学们的指正!特别感谢 chen_03 帮我指正了亿个错误。
想要部分题目的博客源码可以私信。
代码题的代码暂鸽。
- 选择题
1.在 Linux 系统终端中,用于列出当前目录下所含的文件和子目录的命令为( )。
A.
lsB.cdC.cpD.all
ls 命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。
cd 命令用于切换当前工作目录。
cp 命令主要用于复制文件或目录。
all 我也不知道这干啥。
故选 A 。
2.二进制数
00101010_2 和00010110_2 的和为( )。A.
00111100_2 B.01000000_2 C.00111100_2 D.01000010_2
计算题,
算出来是
3.在程序运行过程中,如果递归调用的层数过多,可能会由于( )引发错误。
A. 系统分配的栈空间溢出
B. 系统分配的队列空间溢出
C. 系统分配的链表空间溢出
D. 系统分配的堆空间溢出
递归的时候是像栈一样,先进后出的。
故选 A 。
4.以下排序方法中,( )是不稳定的。
A. 插入排序 B. 冒泡排序 C. 堆排序 D. 归并排序
补充不稳定是什么:
比如
故选 C 。
5.以比较为基本运算,对于 2n 个数,同时找到最大值和最小值,最坏情况下需要的最小的比较次数为( )。
A.
4n-2 B.3n+1 C.3n-2 D.2n+1
关于从原题那年就开始理解错这件事。
把序列分成两半,长度分别为
所以
故选 C 。
6.现有一个地址区间为
0 到10 的哈希表,对于出现冲突情况,会往后找第一个空的地址存储(到10 冲突了就从0 开始往后),现在要依次存储(0,1, 2,3,4,5,6,7) ,哈希函数为h(x)=x^2 \bmod 11 。请问 7 存储在哈希表哪个地址中( )。A. 5 B. 6 C. 7 D. 8
每个都算一下。分别为
重复的调整一下
故选 C 。
7.G 是一个非连通简单无向图(没有自环和重边),共有 36 条边,则该图至少有( )个点。
A. 8
B. 9
C. 10
D. 11
设有
解得
故选 C 。
8.令根结点的高度为 1,则一棵含有 2021 个结点的二叉树的高度至少为( )。
A. 10
B. 11
C. 12
D. 2021
“至少”,故是完全二叉树。
所以
故选 B 。
- 前序遍历和中序遍历相同的二叉树为且仅为( )。
A. 只有 1 个点的二叉树
B. 根结点没有左子树的二叉树
C. 非叶子结点只有左子树的二叉树
D. 非叶子结点只有右子树的二叉树
前序遍历:中左右。
中序遍历:左中右。
所以去掉左时两个相同,选择 D 。
10.定义一种字符串操作为交换相邻两个字符。将
\mathtt{DACFEB} 变为\mathtt{ABCDEF} 最少需要( )次上述操作。A. 7 B. 8 C. 9 D. 6
考虑冒泡排序思想。
B.
\mathcal{O}(n^2) C.
\mathcal{O}(2^n) D.
\mathcal{O}(n \log n)
看程序,是
故选 B 。
32.输出的第一行为( )。
A.
0xffB.255C.0xFFD.-1
怎么说,有的人电脑是 -1 有的人是 255 。等最后官方通知。
答案是 D 。
33.(4 分)当输入为
0 CSP2021csp时,输出的第二行为( )。A.
Q1NQMjAyMWNzcAv=B.Q1NQMjAyMGNzcA==C.
Q1NQMjAyMGNzcAv=D.Q1NQMjAyMWNzcA==
模拟,选 D 。
- 完善程序
(1)
(魔法数字)小 H 的魔法数字是
4 。给定n ,他希望用若干个4 进行若干次加法、减法和整除运算得到n 。但由于小 H 计算能力有限,计算过程中只能出现不超过M = 10000 的正整数。求至少可能用到多少个4 。例如,当
n = 2 时,有2 = (4 + 4)/4 ,用到了3 个4 ,是最优方案。试补全程序。
本题类似 dijkstra ,每次选择已经确定最小操作的数字来转移到其他数字。
而 vis 记录已经确定不会再更改操作数的数。
- ①处应填( )
A.
F[4] = 0B.F[1] = 4C.F[1] = 2D.F[4] = 1
首先
对于程序来说,都是小操作数转移到大操作数。
故选 D 。
- ②处应填( )
A.
!Vis[n]B.r < nC.
F[M] == INT_MAXD.F[n] == INT_MAX
结束掉件首先肯定是
但
当
故选 A 。
- ③处应填( )
A.
F[i] == rB.!Vis[i] && F[i] == rC.
F[i] < F[x]D.!Vis[i] && F[i] < F[x]
这题真的很像 dij ,选择一个没转移过的但又不会再被转移的数。
选 D 。
- ④处应填( )
A.
F[i] < F[x]B.F[i] <= rC.Vis[i]D.i <= x
两个数转移到新的数,只有当这两个数都是最优的时候,才能保证本次转移不会白转移(指其中一个数再更新本次转移作废)。
故选 C 。
(2)
(RMQ 区间最值问题)给定序列
a_1,...,a_n ,和m 次询问,每次询问给定l,r ,求\max\{ a_1,...,a_n \} 。为了解决该问题,有一个算法叫 the Method of Four Russians ,其时间复杂度为
\mathcal{O}(n+m) ,步骤如下:
建立 Cartesian(笛卡尔)树,将问题转化为树上的 LCA(最近公共祖先)问题。
对于 LCA 问题,可以考虑其 Euler 序(即按照 DFS 过程,经过所有点,环游回根的序列),即求 Euler 序列上两点间一个新的 RMQ 问题。
注意新的问题为
\pm 1 RMQ,即相邻两点的深度差一定为1 。下面解决这个
\pm 1 RMQ 问题,“序列”指 Euler 序列:
设
t 为 Euler 序列长度。取b=\left\lceil\dfrac{\log_2 t}{2}\right\rceil 。将序列每b 个分为一大块, 使用 ST 表(倍增表)处理大块间的 RMQ 问题,复杂度\mathcal{O}(\frac{t}{b}\log t)=\mathcal{O}(m) 。(重点)对于一个块内的 RMQ 问题,也需要
\mathcal{O}(1) 的算法。由于差分数组2^{b-1} 种,可以预处理出所有情况下的最值位置,预处理复杂度\mathcal{O}(b 2^b) ,不超过\mathcal{O}(n) 。最终,对于一个查询,可以转化为中间整的大块的 RMQ 问题,以及两端块内的 RMQ 问题。
试补全程序。
我大受震撼。
先把程序大概扫一遍,懂在干嘛。话说为什么我考试的时候都没看到差分这句话?
38.①处应填( )
A.
p->son[0] = S[top--]B.p->son[1] = S[top--]C.
S[top--]->son[0] = pD.S[top--]->son[1] = p39.②处应填( )
A.
p->son[0] = S[top]B.p->son[1] = S[top]C.
S[top]->son[0] = pD.S[top]->son[1] = p
这部分是在建笛卡尔树,笛卡尔树就是对于序列区间
可以用单调栈来解决。对于栈顶小于当前元素的情况,显然可以不断弹出,使当前元素找到他最大的左二子。
故 38 题选 A 。
而上述操作结束后,栈顶的元素就比当前元素大,所以可以先把栈顶的右儿子设为当前元素。若后面出现更大的也会覆盖掉。
故 39 题选 D 。
40.③处应填( )
A.
x->dep < y->depB.x < yC.
x->dep > y->depD.x->val < y->val
其实在建完笛卡尔树后,val 就没有用处了。
这部分的 min 是在处理 st 的时候用的,所以是考虑深度。
另外都 min 了不可能去操作 max 的方法吧((
故选 A 。
41.④处应填( )
A.
A[i * b + j - 1] == A[i * b + j]->son[0]B.
A[i * b + j]->val < A[i * b + j - 1]->valC.
A[i * b + j] == A[i * b + j - 1]->son[1]D.
A[i * b + j]->dep < A[i * b + j - 1]->dep
首先前面都说了 val 已经没有用了(
因为只有
故选 D 。
42.⑤处应填( )
A.
v += (S >> i & 1) ? -1 : 1B.
v += (S >> i & 1) ? 1 : -1C.
v += (S >> (i - 1) & 1) ? 1 : -1D.
v += (S >> (i - 1) & 1) ? -1 : 1
这里是预处理出块内所有的
因为刚刚是后者小于前者时为 1 。所以为 1 的时候应该
另外注意一下 1 开始的。
故选 D 。
43.⑥处应填( )
A.
(Dif[p] >> (r - p * b)) & ((1 << (r - l)) - 1)B.
Dif[p]C.
(Dif[p] >> (l - p * b)) & ((1 << (r - l)) - 1)D.
(Dif[p] >> ((p + 1) * b - r)) & ((1 << (r - l + 1)) - 1)
对于一个块内的查询
这里的 S 是要确认本区间的状态。
而刚刚的 Dif 已经预处理好了,p 是块的位置。
所以选 C 。