题解:P8004 Welcome to Lunatic City

· · 题解

首先由于经过传送门的操作可逆,对于点 u,若其可通过传送门不经过其他顶点到达点 v,则我们在 u, v 之间连接一条无向边。故要求即为建出的新图连通。我们发现 u 出发只能选择向其连出的 d_u 条边出发后一直走,可知在新图中 u 的度数也必为 d_u。特别地,我们发现新图边数为 n - 1,故新图也是一棵树。

另一方面,我们发现如果有一棵树满足对于所有 u,都有 u 的度数为 d_u,我们对新树中的 u 为端点的每条边 uv,都可以一一对应原树上的边 uv'(注意对于 v 在原树上可能对应另一条边 u'v),则我们在 uv' 上离 u 最近的位置放一个朝向 u 的传送门,再在 u'v 上同理放同一个传送门的另一端即可。我们发现这样恰有 n - 1 对传送门,故必然满足 L 的限制。这部分是 \mathcal{O}(n) 的。

至此,我们把问题转化为了构造一棵新树,满足每个点的度数与原树相同,并且 1x_1, x_2, \cdots, x_m 的距离和尽量小。

考虑观察一些性质并进行贪心。以 1 为根,我们发现同一层(即深度相同)的结点可以互换,所以我们即需要决策每个点被放在哪层。考虑从上往下依次填入结点。我们称 x_1, x_2, \cdots, x_m 为关键点。感受一下,我们发现先放关键点和先放度数较大的点是两个比较有道理的方向。考虑使用调整法研究具体的放置方法。

调整显然可以发现对于关键点和非关键点内部肯定根据度数从大到小填。然后度数相同时显然关键点先填。对于关键点 x 和非关键点 y,若 x 填在深度 iy 填在深度 i + 1,且 d_x < d_y,且存在关键点 z 的深度 \ge i + 2,我们可先交换第 i + 2 层的结点使 y 的子树中含有关键点,再将 x, y 交换(不交换其子树其他点),并取 yd_y - d_x 个子节点的子树,且保证其中至少含一个关键点,挂到原来 x 的位置。则 x 的深度会增加 1,但还有至少一个关键点的深度会减少 1,所以不劣。不断这么操作,结合同层节点可任意互换,设最深的关键点深度为 mx,则我们可以保证所有深度在 0, 1, \cdots, mx - 1 的点的二元组 (d, key) 在填入顺序中不减。其中 key 在是关键点时为 1,否则为 0。故我们可以找到一个分界点 p,使得前 p 个填入的点为 (d, key) 的前 p 大,后 n - p 个填入的点会先按 d 从大到小填剩余所有关键点,再任意填剩余所有非关键点。

考虑枚举 p 进行判断。我们设填入 (d, key)p 大的点之后本层还剩余 a 个结点。那么我们用前缀和可 \mathcal{O}(1) 算出填完本层后下一层的结点个数 b,此后再一层一层填同时计算答案与判断合法性,就可以得到一个 \mathcal{O}(n ^ 2) 的暴力做法。

考虑优化,我们发现在只剩 d = 1, 2 的点时是容易 \mathcal{O}(1) 特判的(即每个点下面都挂一条链),那么我们只用不断填入 d \ge 3 的点。但每填入一个 d \ge 3 的点都会在下一层创造两个空位。故每填一层空位数量翻倍。又因为 b 至少为此前填入的结点数量 p,所以这部分的复杂度是 \mathcal{O}(\log\dfrac{n}{p}) 的。在求出所有 p 的答案之后,我们取最大的进行构造即可。使用桶排序后,时间复杂度即为 \mathcal{O}(\sum\limits_{i = 1} ^ n \log\dfrac{n}{i})。又因为 \displaystyle \int_1 ^ n \ln x \ dx = (x\ln x - x) \Big|_{1}^{n} = n \ln n - n + 1,故总复杂度为 \mathcal{O}(n)