QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: Milmon

Posted at: 2026-02-25 13:00:37

Last updated: 2026-02-25 13:00:42

Back to Problem

题解

先考虑如何比较任意的两个数 $u, v$。取另一点 $x$ 为中心点,设其余点为 $t_1, t_2, \cdots, t_{n - 3}$。构造这样一棵树:$(x, u), (u, v), (x, t_1), (x, t_2), \cdots, (x, t_{n - 3})$。如果最大独立集没有选择 $x$,那么就可以得到 $A[u], A[v]$ 的大小关系。如果选择了 $x$,那么说明 $A[x] \geq A[t_1] + A[t_2] + \cdots A[t_{n - 3}]$,此时将 $x$ 换为 $t_1, t_2, \cdots, t_{n - 3}$ 中的任意一个。若仍然选择中心点,那么说明两部分相等并且不影响最大独立集,从而可以得到 $A[u]$ 和 $A[v]$ 的大小关系。

更进一步地,我们发现中心点上多挂一些长度为 $2$ 的链就可以实现一次询问同时比较多对数的大小关系。考虑取出两个结点 $u, v$ 作为中心点候选点,在其中一点上挂 $k$ 条长度为 $2$ 的链,若独立集选择了挂链的点,就换一个点挂链。这样在若干次询问中,只会有一次切换浪费的询问。

对于剩下 $n - 2$ 个点,初始分别属于一个不同的组,接下来执行若干轮合并操作,每次将两个组合并并保持升序。归并考虑每次先把两组中一组反转后拼接成一组,并保持每组都是循环位移后单调增再单调减的序列,每次把一组从中间拆成两段,并将两段逐位比较大小,将小的放到前一组,大的放到后一组,那么此时每组仍然符合这个性质,并且前面的组总是比后面的组小。这样经过 $\log$ 轮拆分后,每一组都被拆分成了若干个长度为 $1$ 的组,并且组之间已经排序。

第 $i$ 轮归并需要的询问的次数为 $i$,本题中最多需要 $10$ 轮归并,总询问次数为 $55$,算上切换中心点浪费的那一次,还剩 $14$ 次询问机会。

接下来还需要将两个候选中心点插入进序列中。可以将两次二分按照类似的方法并行,如果二分选择的中点重合就调整 $1$。由于这个序列的大小关系已知,所以不会有切换中心点的次数浪费。这部分操作次数为 $\log n + \mathcal{O}(1)$,可以通过此题。

Comments

No comments yet.