我们按照 $\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$。
参考代码: