NOIP2023模拟测试赛(十六)
T3 Circle of digits
首先容易发现,分割字符串一定是分割成 \(K - \left\lfloor \dfrac{N}{K}\right\rfloor \times K\) 个长度为 \(len = \left\lceil \dfrac{N}{K}\right\rceil\) 的和 \(\left\lfloor \dfrac{N}{K}\right\rfloor \times K\) 个长度为 \(len2 = \left\lfloor \dfrac{N}{K}\right\rfloor\) 的。
例如样例,分割成了 \(1\) 个 \(3\) 和 \(2\) 个 \(2\)。
此时最大值将会在长度为 \(len\) 的串中。
考虑二分。
直接二分由于数字太大不可行,但最终答案一定是某个长度为 \(len\) 的串。我们二分子串,取出所有长度为 \(len\) 的子串,用后缀数组将其排序。
接下来是如何判断可行性。即,如果我们选择的长度为 \(len\) 的串都小于 \(str\),是否可以分割恰好 \(K\) 段。
因为 \(len \geq len2\),所以如果能够分割成 \(< K\) 段,我们可以通过将长度为 \(len\) 的分割替换为长度为 \(len2\) 的分割,一定可以使得恰好分割成 \(K\) 段。
考虑这样一个贪心:当固定一个分割点时,从这个分割点开始,往右扫描,如果分割出的长度为 \(len\) 的字符串小于等于 \(str\),则贪心分割,反之则分割成 \(len2\)。统计分割段数,与 \(K\) 比较。
发现这个时间复杂度其实是 \(O(\frac{N}{K})\) 的。
我们只需要再枚举分割点,注意到不同分割点只约有 \(K\) 个。
总时间复杂度为 \(O(K\times \frac{N}{K}) = O(N)\)
贪心中字符串比较可以使用后缀数组。
考场上写出来了没过。。。
浙公网安备 33010602011771号