BZOJ 3929 Circle of digits 解题报告

首先,我们可以得到最高位的位数为:(lfloorfrac{n+k-1}{n} floor),记作 (E)

然后给这 (n) 个长为 (E) 的数字排序,后缀数组 (O((n+E)log E)) 搞定。

然后二分最大的数字,记作 (Max),再记一个 (Next_i),表示从 (i) 开始,数字不大于 (Max) 的最远终点。

可以得到: (E - 1 le Next_i le E)

于是我们在([1, Next_1])范围内枚举起点,然后沿着 (Next_i) 不断跳,看跳完一圈需要的步数,记为 (step)

如果有 (step le k),那么就更新上界为 (Max),否则更新下界为 (Max + 1)

要枚举 (O(E)) 个起点,每次要跳 (O(frac{n}{E})) 步,所以每次检验就是 (O(n)) 的了。

什么?数字很大?二分数字不行?

我们二分数字的排名不就可以了吗?

于是这个问题就可以在 (O((n+E)log E + nlog n)) 的时间内解决了。

原文地址:https://www.cnblogs.com/gromah/p/4421584.html