- 代码源挑战赛 Round 17
代码源挑战赛 Round 17 题解
- @ 2026-9-13 16:33:55
T1
100%
假设第 名同学装弱,那么他的真实分数应为 ,其他同学的真实分数仍为报出的分数。
要使真实分数仍按排名非严格递减,需要满足:
- ,即真实分数没有超过满分;
- 若 ,则 ,即他的真实分数没有超过前一名。
不需要检查后一名,因为输入已经保证 ,增加 后仍然满足 。
枚举每个位置并检查上述条件,统计合法位置数即可。时间复杂度为 。
T2
50%
枚举每个位置作为一段连胜的起点,再向右找到第一个 L,可以求出从该位置开始的连续 W 数量。
时间复杂度为 。
100%
从左到右扫描字符串,维护当前连续出现的 W 数量 now 和历史最大值 ans:
- 遇到
W时令now加 ,并用它更新ans; - 遇到
L时令now=0。
每个字符只处理一次。时间复杂度为 。
T3
100%
按从小到大的顺序枚举 的每个因数 。对于固定的 ,将序列依次划分为 个长度为 的连续段,并统计每段中支持款式 的人数 。
该组中支持款式 的人数为 ,所以当且仅当
时,这一组支持款式 。逐组判断并统计即可得到当前 的答案。
因为只枚举 的因数,每种分组都能恰好覆盖所有同学;又因为不同小组对应互不相交的连续段,所以每个小组都会被恰好统计一次。
设 为 的因数个数。对于每个因数都扫描一次整个序列,时间复杂度为 。
T4
30%
每个操作都有选择和不选择两种可能,可以用 DFS 枚举所有选择方案,并在递归过程中维护当前的 。
时间复杂度为 ,递归空间复杂度为 。
100%
令 和 分别表示只考虑前 个操作时,能够得到的最小值和最大值。
初始时还没有处理任何操作,只能得到 ,因此
若不选择第 个操作,原来的结果仍然可达;若选择它,变换为
对于第 个操作,有“不选择”和“选择”两种决策。不选择时,原来的两个极值保持不变;选择时,由于 关于 单调递减,新的最小值由原最大值产生,新的最大值由原最小值产生。因此
$$\begin{aligned} L_i&=\min\bigl(L_{i-1},\ 2a_i-R_{i-1}\bigr),\\ R_i&=\max\bigl(R_{i-1},\ 2a_i-L_{i-1}\bigr). \end{aligned}$$每一步都考虑了是否使用当前操作,因此所有合法的操作子序列都被包含在状态中;而一次跳跃是单调递减的线性变换,其变换后结果的极值只可能由变换前的两个极值产生,所以无需保存其他可达值。最终答案为 。
时间复杂度为 。
T5
50%
固定一次询问的线路宽度 。对于每个节点 ,从 不断向父亲移动,同时维护路径上的最小、最大权值,就能找到满足路径宽度不超过 的最浅祖先 。
求出所有 后,再自底向上贪心。直接逐级向上寻找的单次询问复杂度为 。
100%
先把树以 为根,求出每个节点的父亲、深度以及一份父亲先于儿子的遍历序。以下是单次询问的做法。
对于节点 ,记 为满足
$$\max_{v\in path(high_u,u)}a_v- \min_{v\in path(high_u,u)}a_v\le w$$的最浅祖先。从 向上加入更多节点时,路径最大值不会减小,最小值不会增大,因此路径宽度单调不降。
预处理倍增数组:
- 表示 的 级祖先;
- 分别表示从 到 的路径上的最小、最大权值。
对于一次询问,从节点 开始维护当前路径的最小值和最大值,按 从大到小尝试向上跳 步。若合并这一段后仍满足最大值减最小值不超过 ,就接受这次跳跃。最终停留的位置就是 。
每个节点的 可以在 时间内求出。
每条线路的下端点确定后,都把它的上端点放在能够到达的最浅祖先处,这不会减少它覆盖的节点。
逆序处理节点。令 表示当前已经选择且下端点位于 子树内的所有线路中,上端点的最小深度;若还没有这样的线路,则令 。
先合并所有儿子:
-
若 ,对应线路的下端点在 的子树中、上端点是 或 的祖先,所以这条线路已经覆盖 ;
-
若 ,当前没有任何已选线路覆盖 。新建线路 ,答案加 ,并令
这个贪心是最优的。处理到未覆盖的 时,任何完整方案都必须再加入至少一条覆盖 的线路。若这条线路的下端点是 的严格后代,把它替换成 不会破坏已经完成的子树覆盖;同时,原线路从某个祖先到 的前缀也是合法的,所以 不会比原线路的上端点更深。也就是说,在同样新增一条线路的前提下,选择下端点 对后续祖先的覆盖不会更差。
倍增预处理的时间和空间复杂度均为 。每次询问求所有 需要 ,贪心需要 ,所以总时间复杂度为
T6
20%
当 时可以直接按照定义拼接出 ,再遍历 统计答案。
60%
设 表示 中 wow 的出现次数。由
可知 中的 wow 分为三类:完全位于 中、完全位于 中、跨越两个字符串的拼接位置。记第三类的数量为 ,则
由于 wow 的长度为 ,跨界出现只可能有以下两种形式:
- 左侧字符串的最后一个字符与右侧字符串的前两个字符组成
wow; - 左侧字符串的最后两个字符与右侧字符串的第一个字符组成
wow。
因此只需保存每个字符串长度为 的前缀和后缀,就能在 时间内求出 ,再按照递推式计算 。这一做法的时间复杂度为 。
100%
由于 均非空,所以 。对于 , 的末尾来自 ,且 ,因此
也就是说,从 开始,所有字符串长度为 的后缀都相同。类似地,对于 , 的开头完整来自 ,因此
所以长度为 的前缀按照下标奇偶交替。跨界贡献 只由 的后缀和 的前缀决定,故从 开始也只会在两个常数之间交替。记
$$E_i= \begin{cases} p,&i\text{ 为奇数},\\ q,&i\text{ 为偶数}, \end{cases} \qquad(i\ge5).$$只需构造长度很小的 ,便可直接求出 。其中 是拼接 时的跨界贡献; 是下一次拼接的跨界贡献。计算 时不必构造完整的 ,因为 的前两个字符与 相同。
为处理递推中的加法常数,定义
$$V_i= \begin{pmatrix} C_{i-1}\\ C_i\\ 1 \end{pmatrix}.$$若下一次拼接的跨界贡献为 ,则
$$V_{i+1}= M(c)V_i, \qquad M(c)= \begin{pmatrix} 0&1&0\\ 1&1&c\\ 0&0&1 \end{pmatrix}.$$令
从 出发,第一次转移到 使用 ,第二次转移到 使用 ,之后不断交替。因此可以把相邻两次转移合并为 。
设 。若 为偶数,则
若 为奇数,则
的第二项就是 。当 时直接构造字符串并统计即可。
矩阵大小固定为 ,每组数据的时间复杂度为 。