第四届“传智杯”全国大学生IT技能大赛题解

目录

今年题目难度普遍偏低。只有 D,F 还好。

A

按题目给的公式计算即可。注意应在最后的答案中去掉小数部分。

B

按照题意模拟即可。注意答案要与 \(0\)\(\max\)

C

按照题意模拟即可。注意应该先做乘法在做除法,或者把后面的值用 doublefloat 数据类型的变量存储,并在最后去掉小数部分。

时间复杂度 \(\mathcal O(n)\)

D

\(x \oplus y = p\) ,则 \(x \oplus p = y\)。因此我们要找有多少 \(p\) 满足 \(x \oplus p < x\)

考虑到 \(x \oplus y\) 的值最大为 \(2^{21} – 1\) ,因此我们用线性筛筛出 \(\le 2.1 \times 10^6\) 的所有素数,然后把它们插入一个 01Trie

然后我们要求的答案在 01Trie 中其实是一个个字数内的数的个数的和。

在遍历 \(x\) 的每一个二进制位的过程中,设该二进制位为 \(c\),当前节点编号为 \(u\)\(tr_{u,0/1}\) 表示下一个分别是 \(0,1\) 的位置的编号。

如果 \(c=1\),那个 \(tr_{u,0}\) 内的所有子树一定合法,我们加上它子树内的数的个数,然后让 \(u \to rt_{u,1}\),即进入右子树。

如果 \(c=0\),那个子树都不能造成贡献,我们直接进入 \(tr_{u,0}\),即左子树。

如果某个非起始位置 \(u=0\) ,直接退出即可。

时间复杂度为 \(\mathcal O((Cnt + m) \log V)\),其中 \(Cnt\) 是质数个数,\(V\) 是值域。

E

题意可以转化成有 \(k\) 个可重集,每次向里面插入 \(p\) 个数对 \((a,b)\) ,每个数对 \(a,b\) 表示向第 \(a\) 个集合中插入一个值为 \(b\) 的数。

查询的话就是第 \(x\) 个集合中在 \([y_{\min},y_{\max}]\) 内的数有多少个。

发现 \(k,n\) 都很小,对于每个集合维护一个树状数组即可。

时间复杂度 \(\mathcal O(n \log n)\)

F

考虑利用 \(dfs\) 序转化到序列上。

考虑把深度当成主席树的值域维护。

操作一可以直接用一个 lst 变量记录。

操作二就可以直接查询 \([dfn_x, dfn_x + siz_x – 1]\) 这段区间中 \(dep_{pre_i} \ge lst\) 的位置有多少。

注意特判一下一开始整个树都是绿的。

时间复杂度 \(\mathcal O(n \log n)\)

G

注意题目要求是第 \(x,y\) 个质数。

其实是一道诈骗题。

发现如果两个数满足相异或为 \(1\) 那么他们两个数的值必定只差 \(1\),而这样的质数对只有 \((2,3)\) 这一对,特判一下即可。

时间复杂度 \(\mathcal O(T)\)

Tags: