CF1579B Shifting Sort

题目描述

新一代外部存储器包含一个整数数组 $ a[1 \ldots n] = [a_1, a_2, \ldots, a_n] $。 这种存储器不支持更改任意元素的值。相反,它允许你从给定数组中剪切出任意一段,按任意偏移量进行循环移动(旋转),然后插入回原来的位置。 从技术上讲,每次循环移位都由两个连续的动作组成: 1. 您可以选择任意下标 $ l $ 和 $ r $ ($ 1 \le l < r \le n $)作为线段的边界。 2. 然后用任意偏移量 $ d $ 来替换线段 $ a[l \ldots r] $,使其向左循环移动。循环移动的概念也可以用下面的关系来解释:序列 $ [1, 4, 1, 3] $ 是序列 $ [3, 1, 4, 1] $ 向左偏移偏移量 $ 1 $ 的循环移动,序列 $ [4, 1, 3, 1] $ 是序列 $ [3, 1, 4, 1] $ 向左偏移偏移量 $ 2 $ 的循环移动。 例如,如果 $ a = [1, \color{blue}{3, 2, 8}, 5] $,那么选择 $ l = 2 $ , $ r = 4 $ 和 $ d = 2 $ 就会得到一个线段 $ a[2 \ldots 4] = [3, 2, 8] $。 然后这个线段通过偏移 $ d = 2 $ 向左移动,就会得到一个线段 $ [8, 3, 2] $ ,这个线段就取代了线段的原始元素。最后得到 $ a = [1, \color{blue}{8, 3, 2}, 5] $。 对给定数组 $ a $ 进行排序,每次循环移动不超过 $ n $。请注意,您不需要尽量减少循环移动的次数。任何需要 $ n $ 或更少的循环移动的方法都会被接受。

输入格式

第一行包含一个整数 $ t $($ 1 \leq t \leq 1000 $)——测试用例数。 接下来的 $ 2t $ 行包含测试用例的描述。 每个测试用例描述的第一行包含一个整数 $ n $($ 2 \leq n \leq 50 $)—— 数组的长度。第二行由空格分隔的数组元素 $ a_i $($ -10^9 \leq a_i \leq 10^9 $)组成。数组 $ a $ 中的元素可以重复,不一定是唯一的。

输出格式

输出 $t$ 个测试用例的答案。 每个测试用例答案的第一行应该包含一个整数 $ k $($ 0 \le k \le n $)—— 对数组进行排序的操作数。接下来的 $ k $ 行应该包含动作描述,格式为 `l r d`,其中 $ l $ 和 $ r $($ 1 \le l < r \le n $)是被移动段的边界,而 $ d $($ 1 \le d \le r - l $)是偏移值。请记住,只考虑向左的循环移动,因此所选的线段将通过偏移 $ d $ 向左移动。 请注意,您不需要找到排序所需的最小循环移动次数。任何移位次数不超过 $ n $ 的排序方法都可以接受。 如果给定数组 $ a $ 已经排序,其中一个可能的答案是 $ k = 0 $ 和一个空的循环移位序列。 如果有多个可能的答案,可以打印任意一个。

说明/提示

解释示例中的第四组数据: 1. 选中线段 $ a[2 \ldots 4] $ 并向左移动 $ 2 $ : $ [2, {\color{blue}{5, 1, 4}}, 3] \longrightarrow [2, {\color{blue}{4, 5, 1}}, 3] $; 2. 然后选择线段 $ a[1 \ldots 5] $ 并向左移动 $ 3 $ : $ [{\color{blue}{2, 4, 5, 1, 3}}] \longrightarrow [{\color{blue}{1, 3, 2, 4, 5}}] $; 3. 之后,选中线段 $ a[1 \ldots 2] $,并向左移动 $ 1 $:$ [{\color{blue}{1, 3}}, 2, 4, 5] \longrightarrow [{\color{blue}{3, 1}}, 2, 4, 5] $; 4. 最后,线段 $ a[1 \ldots 3] $ 被选中并向左移动了 $ 1 $ : $ [{\color{blue}{3, 1, 2}}, 4, 5] \longrightarrow [{\color{blue}{1, 2, 3}}, 4, 5] $。