Daniel_yuan's Blog

芙卡米天下第一可爱 n(*≧▽≦*)n

0%

[IOI2018] 机械娃娃 题解

题面在此

第一想法是对于某个触发器,它的出边是固定的,如果它的出边集合大小大于 \(1\) 的话,就只能连到开关上。所以就考虑用开关来表示一个触发器的所有出边。

不难构造出一个完满二叉树的结构。按照题目顺序把前几个叶子和最后一个叶子连到这个触发器的出边上,中间的叶子就全部回到根。类似下图,其中 \(T\) 集合为某个触发器的出边集合。(其中 \(1'\) 就是 \(1\),画图原因),路线就是 \(T1,T2,(1),T3\),走完之后所有开关都在 X

仔细想想可以发现我们并不需要对每个点都开一个完满二叉树,我们完全可以只用一个完满二叉树来存储所有的出边。类似下图,其中 \(A\) 是给定序列。

路线就是 \(A0,A1,A2,...\)

这样我们需要 \(A\) 序列长度为 \(2\) 的整数次方,最坏情况我们不能接受。

考虑 \(M=1\) 的部分分,我们可以构造出来一个这样的结构,其中方点是开关。

我们仅用了 \(3\) 个开关,就使得 \(U\) 可以被到达 \(7\) 次。

考虑每个开关的 X 边贡献,不难发现在图中标号为 \(v\) 的开关的 X 边会经过 \(2^v\) 次。所以我们可以通过对 X 边的控制来使得 \(U\) 可以被经过 \([0,2^3-1]\) 次。

我们把每个 X 边所链接的都改成一个上述的完满二叉树,我们可以通过对 \(N\) 的二进制拆分来决定每个完满二叉树存在与否,就可以通过 \(N+\log_2N\) 实现按照顺序遍历 \(A\) 序列。