- 代码源挑战赛 Round 75
代码源挑战赛 Round 75 题解
- @ 2026-9-16 13:31:01
T1
100%
用三个布尔值记录三盏灯的状态,初始都为关闭。每读到一个编号 ,就将对应状态取反。三次操作结束后,统计状态为开启的灯数即可。
时间复杂度为 ,空间复杂度为 。
T2
100%
不难发现采用从 开始的下标时,左移后的字符串满足
枚举 ,统计满足 的位置数量即可。
时间复杂度为 ,空间复杂度为 。
T3
100%
设第 条通道被多少次任务经过为 。如果传送门建在通道 上,就能为每个经过它的任务节省 路程,总节省量为 。
对任务区间 ,它经过的通道编号为 。利用差分和前缀和即可得到每条通道的 。没有传送门时,全部任务的总路程为
最优传送门应放在 最大的通道上,所以答案为
时间复杂度为 ,空间复杂度为 。注意答案可以达到 量级,需要使用 long long。
T4
100%
若 合法,则每个出现过的余数都恰好对应两个数。先考虑 :必然存在某个 ,使得 与 对 同余,即
因此
这说明任意合法的 ,一定是某个 的正因数。候选集合不需要从 枚举到 ,只需枚举 与其余各数之差的全部正因数。依次检查是否满足条件即可。若没有因子满足条件,输出 。
设候选因数个数为 (因数大致个数在 左右),检查候选的时间复杂度为 。足够通过本题。
T5
15%(特殊性质 A)
当所有 相等时,从任意起点出发都能启动相邻站点;由于图连通,最终一定能启动全图,答案为 。
25%
当 时,可以对每个起点独立模拟。维护当前总功率以及所有与已启动集合相邻的点,并总是选择其中 最小的点:若最小值也大于当前总功率,就不可能继续;否则启动它并扩展边界。
选择最小的可用点不会使后续更差,因为启动站点不消耗功率,只会让总功率增加。
100%
为每条边 定义边权
也就是说一个点当前权值是 时,它想走 这条边,至少需要 的权值。跨过这条边后,权值还会继续增加。利用这个思路,我们考虑维护连通块内的信息。
将所有边按照 从小到大排序,用 Kruskal 的方式维护连通块。每个初始连通块只含一个点 ,维护两个量:
- :块内所有点的权值总和;
- :能够从块内出发并启动完整个块的起点数量。
当一条边权为 的边连接了两个不同连通块 时,将它们合并为 :
$$good_Z= [sum_X\ge w]\cdot good_X+ [sum_Y\ge w]\cdot good_Y.$$这里 表示命题 成立时为 ,否则为 。
即:从 中的一个好起点出发,可以先启动完整个 。若此时 ,就能跨过当前边。此前合并进 的所有边门槛都不超过 ,而当前功率已经至少为 ,所以进入 后一定可以启动完整个 。若 ,则连门槛为 的第一条跨块边都无法通过。来自 的起点同理。
时间复杂度为 ,空间复杂度为 。
T6
25%
固定第一次只采用一种放法,之后枚举其余 个音符放左还是放右,共有 种不同结果。逐个检查最终排列是否相邻大小关系交替即可。
时间复杂度为 。
100%
依次插入元素时,新元素只会出现在当前序列的最左端或最右端。一次插入只会新产生一组相邻关系,序列内部原有的相邻关系不会改变。因此,如果某个中间序列已经不满足大小关系交替,之后无论怎样插入都无法修复。只需在每一步维护当前序列始终合法。
处理完前若干个元素后,最后加入的元素一定处于某个端点。为了继续转移,只需记录下面三类信息:
- 另一个端点的数值;
- 最后加入的元素位于左端还是右端;
- 当前序列最左侧第一组相邻元素的大小关系。
由前两项可以确定当前左右端点。又因为整个序列的大小关系交替,所以知道第一组相邻元素的大小关系以及当前序列长度的奇偶性后,就能确定最右侧最后一组相邻元素的大小关系,不需要记录序列内部的其他信息。
前两个元素可以形成两种不同序列,分别作为动态规划的初始状态。之后加入一个新元素时分两种情况:
- 放到左端。比较新元素与原左端点,只有新产生的大小关系与原来的第一组大小关系相反时,序列才仍然合法。转移后,新元素成为左端点,第一组大小关系也随之更新。
- 放到右端。先根据第一组大小关系和当前长度的奇偶性推出最后一组大小关系。只有新产生的大小关系与它相反时,才允许转移。此时第一组大小关系保持不变。
每次转移都对方案数取模。处理完全部元素后,将所有状态的方案数相加即可。 时只有一个最终排列,答案为 。
这里按插入方式计数不会造成重复。对于任意一个能够得到的最终排列,数值 一定在某个端点;删去它后, 也一定在剩余序列的某个端点。不断逆序删除即可唯一还原每一步放在左端还是右端。因此不同的转移过程对应不同的最终排列。
另一个端点有 种可能,其余两项都只有常数种取值,所以每一层有 个状态,共进行 层转移。时间复杂度为 ,使用滚动数组后空间复杂度为 。