7 月 22 日模拟赛
A
期望得分:100
实际得分:100
算法:dp
难度:黄
弱智题。假设有一条链,\(v\) 是 \(u\) 的后继,那么从 \(v\) 继承答案时,所有以 \(v\) 为起点、长度为 \(k\) 的链,由于新增了 \(u\) 点链长会增加 \(1\)。总共有 \(n - u + 1\) 条链(包括长度为 \(0\) 的),所以以 \(u\) 为起点的答案会增加 \(n - u + 1\) 个,即 \(ans_u = ans_v + n - u + 1\)
B
期望得分:100
实际得分:20
难度:黄
挂分原因:一开始看错了题,对着错误的数据想了半天没想出来自己哪里错了(浪费大量时间)。后来将自己的代码依靠大样例不断打补丁,最终还是有疏漏导致挂分。
算法:模拟
首先每个合法区间的左端点一定顶着 \(b\) 数组,那么枚举左端点然后找到合法的最小的子序列中包含 \(b\) 数组的区间,假设左端点为 \(l\),右端点为 \(r\),那么贡献即为 \(n - r + 1\),若从 \(l\) 到 \(n\) 全都为相同的数,那么贡献为 \(1\)。实际上只有一种情况会导致区间不能生成,从 \(l\) 开始有一段连续相同的数,并且 \(b\) 数组不能把这一段匹配掉,那么以 \(l\) 为起点的区间都是不合法的区间。依照这个思路实际上很好写。
C
期望得分:20
实际得分:20
难度:蓝
挂分原因:一直在折腾 \(next\) 数组,最后没时间推了只好写个 \(n^2\) 暴力,但是写的是暴力匹配一个前缀的合法性,是一个十分假的 \(n^2\)。如果改成哈希判断就可以做到 \(n^2\) 了
算法:二分、哈希(SA) / border 理论(jjz 的神仙在线做法)
注意到每一个可能的长度 \(k\) 如果在一个时刻不合法,那么以后任意一个时刻都不合法,因为 \(a_i\) 要始终等于 \(a_{i + k}\),它们的相对位置始终保持不变。注意到每一个时刻 \(k\) 生成并且仅生成一个长度为 \(k\) 的合法循环节。那么我们考虑找到每一个可能的长度 \(k\) 可能产生贡献的时刻区间 \([l, r]\)。显然要预处理出每一个时刻 \(t\) 所生成的字符串在最后的字符串对应的区间 \([l, r]\),这个很好预处理。考虑二分查找最后产生贡献的时刻 \(r\),那么 \([l, r]\) 这段区间对于循环节长度为 \(k\) 是合法的。假设 \(t\) 是 \([l, r]\) 中最后一个完整的循环节的右端点,如何判断前面这些完整循环节的右端点是否合法呢?因为区间 \([l, l + k - 1] = [l + k, l + 2k - 1] = ... = [t - k + 1, t]\),那么只需要判断 \([l, t - k]\) 是否与 \([l + k, t]\) 相等即可。最后的 \([t + 1, r]\) 要满足为 \([l, l + k - 1]\) 的前缀,随便判断一下即可
D
期望得分:rand
实际得分:0
难度:紫
挂分原因:现在仍未知道我的贪心会有什么问题。还有 2 分的 subtesk 没有注意到
算法:线段树、构造
简直就是神仙题。考虑一个合法的序列,前缀和的范围必须固定在 \([0, s]\) 之间,其中 \(s\) 是所有选择的数的和。显然所有 1 必须要选,选了不会导致前缀和或后缀和变小,但会让序列长度增大,所以 \(1\) 必选。发现 所有前缀和 \(\geq 0\) 和 所有后缀和 \(\geq 0\) 等价于 最大子段和 等于 序列总和。假设存在一个前缀和小于 0,那么不选这个前缀和一定更优,后缀同理。所有序列总和不小于最大子段和。那么让选出来的 -1 尽量多,即让序列总和等于原区间的最大子段和。可以证明这是一定可以取得到的。那么 (选出来的 -1 数量) = (区间内 1 的数量) - (最大子段和),答案为 (区间内 1 的数量) + (-1 的数量) = 2 * (区间内 1 的数量) - (最大子段和)。用线段树随便维护
总结:
一个重要结论:所有前缀和 \(\geq 0\) 和 所有后缀和 \(\geq 0\) 等价于 最大子段和 等于 序列总和。要充分的利用题目中的已知条件,将已知条件转化为方便处理的限制条件从而转化题目。充分考虑题目中所给出的性质,从而加以利用

浙公网安备 33010602011771号