ouuan
场的有意思构造题。
题意简述
定义一对传送门 $(A,A^\prime)$ 为从 $A$ 门进入会从 $A^\prime$ 门出来,且保持进入 $A$ 门的方向(从 $A^\prime$ 进去同理)。
给出一个 $n\times n$ ($1\le n\le 10^3$) 的矩形和 $2n$ 个要求,其中前 $n$ 个要求的形式为 $(r_i,n)$ ,代表 $\texttt{Nauuo}$ 从 $(i,1)$ 这个格子出发一直向右走,经过若干对传送门(或者不经过传送门)后从 $(r_i,n)$ 这个格子走出矩形;后 $n$ 个要求的形式为 $(n,c_i)$ ,代表 $\texttt{Nauuo}$ 从 $(1,i)$ 这个格子出发一直向下走,经过若干对传送门(或者不经过传送门)后从 $(n,c_i)$ 这个格子走出矩形。
请你在这个 $n\times n$ 的矩形中放置若干对传送门,使得这 $2n$ 个请求可以同时满足。输出传送门的对数和每对传送门两个门各自的坐标。
保证 $r_i, c_i$ 为 $1$ 到 $n$ 的排列。无解时输出 $-1$ 。
注意:你不需要找到使用传送门最少的方案数,只需要让你给出的方案可以满足题目中给出的要求。
主要思路
考虑 $n\times n$ 的问题如何转换成 $(n - 1)\times (n - 1)$ 。
假设从第 $i$ 行进的人要从第 $r_i$ 行出去,第 $i$ 行出去的人要是从第 $idr_i$ 行进的人。
假设从第 $i$ 列进的人要从第 $c_i$ 列出去,第 $i$ 列出去的人要是从第 $idc_i$ 列进的人。
考虑满足第 $i$ 行出去的人和第 $i$ 列出去的人。
我们可以在 $(i, idc_i), (idr_i, i)$ 的位置放置一对传送门(如果 $idc_i$ , $idr_i$ 不都为 $i$ ),并且之后不再在第 $i$ 行或第 $i$ 列放置传送门。
此时,满足了第 $idr_i$ 行进的人与第 $idc_i$ 列进的人。并且第 $i$ 行进的人一定会到达 $(idr_i, i)$ ,第 $i$ 列进的人一定会到达 $(i, idc_i)$ 。
然后更改 $idr_{r_i},r_{idr_i},idc_{c_i},c_{idc_i}$ ,继续做下一行即可。时间复杂度 $O(n)$ 。
参考代码
1 |
|