CF1698F Equal Reversal
题目描述
有一个长度为 $n$ 的数组 $a$。你可以对其进行如下操作:
- 选择两个下标 $l$ 和 $r$,满足 $1 \le l \le r \le n$ 且 $a_l = a_r$。然后,将第 $l$ 个到第 $r$ 个元素的子段翻转,即将 $[a_l, a_{l + 1}, \ldots, a_{r - 1}, a_r]$ 变为 $[a_r, a_{r-1}, \ldots, a_{l+1}, a_l]$。
你还给定了另一个长度为 $n$ 的数组 $b$,它是 $a$ 的一个排列。请找出一组不超过 $n^2$ 次操作的方案,将数组 $a$ 变为 $b$,或者报告不存在这样的操作序列。
输入格式
每个测试点包含多组测试数据。第一行包含一个整数 $t$($1 \leq t \leq 100$)——表示测试数据的组数。
每组测试数据的第一行包含一个整数 $n$($1 \le n \le 500$)——表示数组 $a$ 和 $b$ 的长度。
每组测试数据的第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($1 \le a_i \le n$)——表示数组 $a$ 的元素。
每组测试数据的第三行包含 $n$ 个整数 $b_1, b_2, \ldots, b_n$($1 \le b_i \le n$)——表示数组 $b$ 的元素。
保证 $b$ 是 $a$ 的一个排列。
保证所有测试数据中 $n$ 的总和不超过 $500$。
输出格式
对于每组测试数据,如果无法通过不超过 $n^2$ 次操作将 $a$ 变为 $b$,输出 “NO”(不带引号)。
否则,输出 “YES”(不带引号)。然后输出一个整数 $k$($0 \leq k \leq n^2$),表示你将要执行的操作次数。注意,你不需要使操作次数最小。
接下来输出 $k$ 行,每行两个整数 $l_i$ 和 $r_i$($1 \leq l_i \leq r_i \leq n$),表示第 $i$ 次操作的左右端点。
你可以用任意大小写输出 “YES” 和 “NO”(例如 "yEs"、"yes"、"Yes" 都会被识别为肯定回答)。
如果存在多种可行的操作序列,你可以输出任意一种。
说明/提示
在第一个测试点中,可以进行如下操作:$[1,2,4,3,1,2,1,1] \xrightarrow[l=5,\,r=8]{} [1,2,4,3,1,1,2,1] \xrightarrow[l=1,\,r=6]{} [1,1,3,4,2,1,2,1]$。
在第二个测试点中,可以进行如下操作:$[1,2,3,1,3,2,3] \xrightarrow[l=1,\,r=4]{} [1,3,2,1,3,2,3] \xrightarrow[l=3,\,r=6]{} [1,3,2,3,1,2,3]$。
可以证明,在第三和第四个测试点中,不可能将 $a$ 变为 $b$。
由 ChatGPT 4.1 翻译