NFLSPC #1 B题 Permutation 题解

2018-12-02 17:09:56 By diamond_duke

我们按照 $\lvert a[x]-a[y]\rvert$ 从小到大的顺序考虑每一对 $(x,y)$,每次考虑把 $[a_x,a_y]$ 的数字重新排列,使得 $a_x$ 和 $a_y$ 被交换了,而之前所有已知条件都满足。得到这个构造之后直接询问一下这个新的排列是否可行,就可以得到有没有 $(x,y)$ 这个限制。

首先自然的想法是直接拓扑排序一下,如果有环那么一定有限制。但是这样因为单次拓扑排序时间复杂度是 $\Theta (n^2)$ 的,所以总复杂度是 $\Theta (n^4)$ 的。显然 $TLE$(我特意卡了这个做法)。

事实上,这个东西可以如下构造:

  • 首先,如果同时存在一个 $(x,i)$ 和 $(i,y)$ 的限制,那么 $(x,y)$ 一定有限制,不用询问。
  • 否则,一定不存在一个 $i$,使得 $a_x\le a_i\le a_y$,且同时 $(x,i)$ 和 $(i,y)$ 都有限制。设 $A$ 为 $\{i\mid (x,i)\in E,a_x\le a_i\le a_y\}$,其中 $E$ 为已知的限制集合。设 $B$ 为剩下的满足 $a_x\le a_i\le a_y$ 的 $i$。则考虑如下构造 $a'$:
    • 把 $B$ 中的位置按照 $a_i$ 从小到大的顺序设为 $[a_x,a_x+\lvert B\rvert)$;
    • $a'_y$ 设为 $a_x+\lvert B\rvert$;
    • $a'_x$ 设为 $a_x-\lvert A\rvert$;
    • 再把 $A$ 中的位置按照 $a_i$ 从小到大的顺序设为 $(a_y-\lvert A\rvert,a_y]$ 即可。

容易验证这样符合我们上面的要求。

于是我们最后可以得出所有约束条件。然后类似 "HNOI 2015 菜肴制作" 那样贪心拓扑排序即可得到字典序最小的排列了。

时间复杂度:$\Theta (n^3)$,询问次数:至多 $n\times (n-1)/2$。

参考代码:

评论

回复

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。