官方题解|巅峰赛#14
2024-11-11 13:47:02
发布于:浙江
ACGO 巅峰赛#14 题解
写在前面
本场比赛 F. 可变数组 现已恢复评测。
本场排位赛的所有题目的难度评级为:
题目编号 | 题目标题 | 难度 |
---|---|---|
A. | 混淆字符串 | 入门 |
B. | 循环小数 | 普及- |
C. | 特殊的染料 | 普及- |
D. | 君往何处 | 普及/提高- |
E. | 万圣糖果 | 普及+/提高 |
F. | 可变数组 | 普及+/提高 |
非常感谢大家参加本场巅峰赛!
题解简述
以下提供每道题目的思路简述,详细题解的AC代码包括复杂度分析,请点击题目标题查看。
A - 混淆字符串
字符串;模拟
将给出的两个字符串 和 中的所有混淆字符,转化为同一种格式,再比较即可。
B - 循环小数
数学;模拟
我们使用以下方法来得出 的循环序列:
- 进行除法:将 p 作为被除数,不断乘 除以 。
- 记录余数和商:每次除法后会得到一个商和一个新的余数,将商依次记录下来,并对余数继续按照步骤 处理。
- 重复步骤 和 ,当计算出的余数为一开始的 时,说明结束了一轮完整的循环。记录的商的序列即为 的循环序列。
C - 特殊的染料
模拟;枚举
采用冒泡排序的方法,每次进行交换的时候,枚举 ,找到费用最低的满足条件的 ,并累计答案即可。
时间复杂度 。
D - 君往何处
枚举;贪心
从小到大枚举使用的手指数量;
对于枚举的手指数量为 ,存储每个手指下一次可以点击音符的最早时间 ,遍历所有的音符,对于每个到来的音符 使用选择手指 满足 ,来尝试点击这个音符,并且尽可能早地点击这个音符,即 。这样我们便可以保证在使用 个手指的情况下,使得每个音符都可以在允许的最早的时刻被点击。
时间复杂度 。
E - 万圣糖果
动态规划;状态DP
考虑进行状态DP,并从前到后考虑所有礼盒,那么会涉及到 种状态。
- 未使用魔法,礼盒中的糖果数量状态为 。
- 使用 次魔法,礼盒中的糖果状态为 。
- 使用 次魔法,礼盒中的糖果状态为 (即第一次使用魔法的区间结束了)。
- 使用 次魔法,礼盒中的糖果状态为 。(即和第一次使用魔法的区间重合的部分)
- 使用 次魔法,礼盒中的糖果状态为 。(即第和第一次使用魔法的区间不重合的部分)
- 使用 次魔法,礼盒中的糖果状态为 。(即两次使用魔法的区间全部结束)
令 分别对应以上 种状态下前 个礼盒能够拿到的最多的糖果的数量;那么有以下关系转移方式。
令 为前 个礼盒能够拿到的最多的糖果的数量,讨论如何从前 个礼盒能够拿到的最多的糖果数量 转移到 。
最终 便是答案。
时间复杂度 。
F - 可变数组
线段树;二分查找;
详情参考 ACL|通用「线段树」模板
定义二元运算符 op
和单位元 e
。
int op(int a, int b) {return std::max(a, b);};
int e() {return 0;};
使用数组 ,构建线段树,时间复杂度 。
Segtree<int, op, e> sgt(a);
-
对于赋值操作我们直接使用
sgt.set(int p, T x)
,时间复杂度 。 -
对于交换操作,和赋值操作类似,先使用
sgt.get(int p)
操作获取 和 的值,时间复杂度 ;然后再使用sgt.set(int p, T x)
操作,时间复杂度 。 -
查询区间最大值,使用
sgt.prod(l, r)
操作得出,时间复杂度 。 -
在线段树上二分查找,使用
sgt.max_right(int l)
,若返回值大于 则输出 ,否则输出答案。时间复杂度 。
总的时间复杂度 。
这里空空如也
有帮助,赞一个