BZOJ 3929 Circle of digits 解题报告

时间:2021-08-03 16:15:11

首先,我们可以得到最高位的位数为:\(\lfloor\frac{n+k-1}{n}\rfloor\),记作 \(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 + n\log n)\) 的时间内解决了。