CSP 2023 提高组第一轮初赛讲解
CSP 2023 提高组第一轮初赛讲解,by @rgw2010
这里待补。
16:
首先题目意思是求出
1 | unsigned short f(unsigned short x) { |
注意有 unsigned short,那么都需要对
对于第一问,手推一下方程即可,发现应该是无解的,故正确。
对于第三问、第四问、第五问、第六问,手动模拟即可。
故答案为:ABABBD。
17:
对于第一问,因为有
手摸一下小数据,发现 solve1 和 solve2 的值都是一样的,那么直接大胆猜测是相同的;于是第二问错误,第三问正确。
第四问是求 solve1 的时间复杂度,发现有
第五问很明显,只有一重循环,于是是
题目求的是:
第六问
故答案为:BBADBB。
18:
通过瞪眼法逆推我们可以得到题目:
- 给定长度为
的序列 ,将其排序后,找到一个最小的 使得区间 满足 的区间数量 。
第一问显然是正确的。
第二问可以推出
第三问手算一下即可,也是正确的。
第四问这里有点小坑,首先排序是
第五问将区间
第六问也是手算一下即可。
故答案为:AAACBB。
19:
首先通过提示可以得到程序是先求出以每个点开始的路径数量,即
那么状态转移方程显然是:
注意因为是DAG,要按照拓扑排序的方式转移。
故第二问应该是 deg[v] == 1,第三问是 std::min(f[u] + f[v], LIM)。
首先要确定起点,若以
就是 next 函数的部分,则第一问应该填 k <= f[u]。
第四问应该是 k>1,即当
因为每次找下一个点时当前路径也需要舍去,则第五问是 --k。
故答案为:BAADC。
20:
对于第一问,要注意 std::vector<int> pre(a + mid, a + r);,即将 pre 这个名字已经提醒了是前缀了,于是应该填 pre[i] = std::max(pre[i], pre[i - 1])。
第二问这里有一个坑,它的 max = std::max(max, a[i]); 是在 while (j < r && ②) ++j; 后面的。
不然如果放在前面的话应该是可以选 pre[j - mid] < max 的,即找到第一个
那我们现在看一下在没有先取 a[j] < a[i]。
这样在每次走指针前 max。
那么显然只有当 max 时才可以使得
那么此时考虑计算左端点为
以
max为最大值的区间,则,贡献为 ,故第三问填 (long long)(j - mid) * max。在区间右端点
时,贡献是 ,因为代码中已经计算出了 的前缀和,故第四问填 sum[r - mid] - sum[j - mid]。
观察代码可以发现 solve(l,r) 计算的是 solve(0,n)。
故答案为:DBACA。
- 标题: CSP 2023 提高组第一轮初赛讲解
- 作者: rgw2010
- 创建于 : 2024-09-14 00:00:00
- 更新于 : 2024-09-14 09:17:30
- 链接: https://rgw2010.github.io/2024/09/14/CSP 2023 提高组第一轮初赛讲解/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。