- 代码源挑战赛 Round 1
代码源挑战赛 Round 1 题解
- 2025-3-6 23:12:18 @
T1
100%
用循环语句完成 的输入,在输入的同时用 操作判断是否是奇数,如果是奇数就更新答案。
注意判断 中未出现奇数的情况。
T2
100%
首先当 是奇数时,无法恰好覆盖,证明如下:
的砖块面积为 ,所以覆盖的总面积也一定是 的整数倍,也就是说覆盖的面积只能是偶数不能是奇数。
而 是偶数时,存在恰好覆盖的方案,以下是其中一种方案:
因为 是偶数,所以 和 中至少有一个是偶数。
若 是偶数,我们把砖块竖着放置,每行 块,放 行,如下方左图。
若 是偶数,我们把砖块横着放置,每行 块,放 行,如下方右图。
所以直接判断 的奇偶性即可。
T3
30%
先用两重循环枚举区间的左端点 和右端点 ,再用一重循环进行区间内 的求和。
时间复杂度 。
60%
预处理 的前缀和 。
用两重循环枚举区间的左端点 和右端点 ,用 来 求出区间和。
注意最终答案可能会爆 。
时间复杂度 。
100%
从贡献的角度:考虑 在哪些区间里会对答案分别产生什么样的影响。
如果区间包含 ,那么会让答案增加 。即贡献为 的区间的数量,乘上 。
此时 和 的取值范围是独立的, 的取值范围为 , 的取值范围为 ,所以这样的区间共有 个。
所以最终答案为 。注意不仅最终答案会爆 ,过程中也可能爆 。
时间复杂度 。
T4
30%
对于测试点#3~5,按照题目所说,对每个询问,模拟过程中的位置变化即可。
记 最大值为 。
时间复杂度 。
50%
对于测试点#1~2,可以用 维护从 出发, 秒之后所在的位置。转移式为 。
时间复杂度 。
结合第一部分可以拿到 的分数。
时间复杂度 。
100%
按照倍增的思路,用 维护从 出发, 秒之后所在的位置。转移式为 。
用倍增的思路,将每个询问分解为若干个时间长度为 的幂的步骤(比如 ),通过之前维护的 数组模拟每个步骤的位置变化。
时间复杂度 。
T5
20%
用两重循环枚举区间的左端点 和右端点 ,对区间内的元素进行排序,如果第 小的元素大于等于 那么最终答案增加 。
时间复杂度 。
50%
“区间内第 小的元素大于等于 ”可以转化为“区间内小于 的元素少于 个”。
用 维护前缀 中小于 的元素的个数。
用两重循环枚举区间的左端点 和右端点 ,用 求出区间内小于 的元素的个数,如果少于 个那么最终答案增加 。
时间复杂度 。
100%
- 方法1:
对于同一个左端点 ,区间内小于 的元素的个数是随着右端点 的增大而递增的。
因此对于每个 ,我们可以用二分右端点 ,用上述方法进行check,找出最大的 满足 是过分子的区间,即对于左端点 ,右端点取 时都是过分的子区间,答案增加 。
时间复杂度 。
- 方法2:
不难发现这个满足条件的最大的右端点 ,也是随着左端点 的增大而递增的,因此我们可以用双指针的思路来求出每个 对应的最大的 。
时间复杂度 。
- 方法3:
预处理第 个满足 的位置 ,枚举 作为区间内第一个小于 的元素所在位置,那么对应的过分子区间的左端点取值范围为 ,右端点的取值范围为 。
另外还有一类过分的子区间是不包含小于 的元素的,枚举左端点 ,设 右侧最近的小于 的元素位置为 ,那么右端点的取值范围为 。
时间复杂度 。
T6
20%
对于测试点#1~2,因为 所以可以直接从 个 到 个 枚举答案,枚举后再统计每一种数字的出现次数,判断是否满足出现次数都不超过 的限制。
时间复杂度 。
30%
对于测试点#1~3,可以用 或其他方法,从 个 到 个 枚举答案,枚举的同时统计每种数字的出现次数。如果用 来实现,前缀不满足条件时还可以直接剪枝。
时间复杂度 。
40%
对于测试点#1和测试点#4,因为 所以答案就是 。注意最终答案可能会爆 ,要取模。
时间复杂度 。
结合第二部分可以拿到 的分数。
100%
将问题转化为在 个空位分别填入 这 种数字。用 表示用前 种数字(即 )填了 个位置的方案。
考虑前 种数字已经填了 个位置,在剩下的 个位置中再选 个位置填第 种数字,那么转移方程为 。
另一种思路是考虑前 种数字填 个位置,其中第 种数字占 个位置,那么转移方程为 $dp[i][j]=\sum_{p=0}^{k} dp[i-1][j-p]\times \binom {n-(j-p)} {p}$。
组合数可以用杨辉三角法预处理。注意过程中的取模和爆 问题。
时间复杂度 。