原题链接

很神妙的一个题。

首先考虑答案下界,不难注意到对于每页面 $k$ 个链接,共 $n$ 个页面的情形,最远两点间需要不小于 $\lceil \log_k n\rceil$ 次点击。

为什么?因为信息熵。对于 $c$ 次点击和 $k$ 个链接,我们有 $k^c$ 种不同的点击序列,即使它们的终点两两不同,最多也只能覆盖 $k^c$ 个点,而我们一共需要覆盖 $n$ 个点。

当然可能点击少于 $c$ 次,所以长度不超过 $c$ 的序列有 $\frac{k^{c+1}-1}{k-1}$ 种。

$$ \begin{aligned} \frac{k^{c+1}-1}{k-1} &\geq n \\ \log_k(k^{c+1}-1)-\log_k (k-1) &\geq \log_k n \end{aligned} $$

当 $n, k$ 趋于无穷大时,左边大约可以视为 $c$。那么 $c$ 自然要取最小的不小于 $\log_k n$ 的整数,也即 $\lceil \log_k n\rceil$。

当然,$k$ 较小时可能有常数级别误差,但问题不大。


然后考虑如何构造。

如果每个点允许三个指针,套用断线树/衡平树的结构是简单的。问题在于本题只有两个指针。

胡乱考虑了一些跳表,但是也无法砍到两个指针。思考了一些环状结构上建立加速索引,但是用处不大。

发现线段树可以利用叶子节点的剩余指针指回根节点,但最远距离是下界的 2 倍左右。


下面是非独立思考部分。

各种树形结构都有对父指针的需求。但叶子指针指回根节点以及环状结构启发了我们。

注意到叶子指针指回根节点只利用了一个指针,不够充分。

我们考虑一棵堆式存储的线段树,但叶子节点的两个指针对 $n$ 取模。

形式化的:节点 $p$ 的两个指针指向节点 $(2p) \bmod n$ 与 $(2p+1) \bmod n$,如果其中一个数为 0,则指针指向 $n$。

这个构造达到了接近理论下界。为什么它是对的?

考虑二进制形式。从 $i$ 走到 $j$,点击 $c$ 次链接,相当于在 $i$ 后面任意添加 $c$ 个数字。

那么原始值 $i$ 产生的贡献等于 $2^c i$,设 $x \in [1, n] \equiv j - 2^c i \pmod n$,显然 $x$ 可以表示为不超过 $c$ 位的二进制数(因为 $2^c > n$)。

那么操作中我们在 $i$ 后方添加可以形成 $x$ 的那些数字即可。

代码也就非常简单了。