欢迎来到起遇信息学
起遇信息学正处于上线筹建阶段,以下功能已全部开放免费体验: ✅ 完整题库浏览与代码提交评测(C / C++ / Python / Java 等) ✅ 入门到进阶的系列课程试读、作业与考试 ✅ AI 提示、AI 作业分析等智能助教功能 ✅ 赛事模拟与个人能力报告 ✅ 邮箱注册开放 ⏳ 付费课程订阅与微信/支付宝支付通道 ⏳ 手机号登录,微信扫码登录、微信公众号绑定 使用中如遇任何问题,欢迎通过页面底部 **"联系我们"** 与我们沟通。
CF1579B.Shifting Sort
Shifting Sort
题目描述
新一代外部存储器包含一个整数数组 。
这种存储器不支持更改任意元素的值。相反,它允许你从给定数组中剪切出任意一段,按任意偏移量进行循环移动(旋转),然后插入回原来的位置。
从技术上讲,每次循环移位都由两个连续的动作组成:
- 您可以选择任意下标 和 ()作为线段的边界。
- 然后用任意偏移量 来替换线段 ,使其向左循环移动。循环移动的概念也可以用下面的关系来解释:序列 是序列 向左偏移偏移量 的循环移动,序列 是序列 向左偏移偏移量 的循环移动。
例如,如果 ,那么选择 , 和 就会得到一个线段 。 然后这个线段通过偏移 向左移动,就会得到一个线段 ,这个线段就取代了线段的原始元素。最后得到 。
对给定数组 进行排序,每次循环移动不超过 。请注意,您不需要尽量减少循环移动的次数。任何需要 或更少的循环移动的方法都会被接受。
输入格式
第一行包含一个整数 ()——测试用例数。
接下来的 行包含测试用例的描述。
每个测试用例描述的第一行包含一个整数 ()—— 数组的长度。第二行由空格分隔的数组元素 ()组成。数组 中的元素可以重复,不一定是唯一的。
输出格式
输出 个测试用例的答案。
每个测试用例答案的第一行应该包含一个整数 ()—— 对数组进行排序的操作数。接下来的 行应该包含动作描述,格式为 l r d,其中 和 ()是被移动段的边界,而 ()是偏移值。请记住,只考虑向左的循环移动,因此所选的线段将通过偏移 向左移动。
请注意,您不需要找到排序所需的最小循环移动次数。任何移位次数不超过 的排序方法都可以接受。
如果给定数组 已经排序,其中一个可能的答案是 和一个空的循环移位序列。
如果有多个可能的答案,可以打印任意一个。
说明/提示
解释示例中的第四组数据:
- 选中线段 并向左移动 : $[2, {\color{blue}{5, 1, 4}}, 3] \longrightarrow [2, {\color{blue}{4, 5, 1}}, 3]$;
- 然后选择线段 并向左移动 : $[{\color{blue}{2, 4, 5, 1, 3}}] \longrightarrow [{\color{blue}{1, 3, 2, 4, 5}}]$;
- 之后,选中线段 ,并向左移动 :$[{\color{blue}{1, 3}}, 2, 4, 5] \longrightarrow [{\color{blue}{3, 1}}, 2, 4, 5]$;
- 最后,线段 被选中并向左移动了 : $[{\color{blue}{3, 1, 2}}, 4, 5] \longrightarrow [{\color{blue}{1, 2, 3}}, 4, 5]$。
样例
4
2
2 1
3
1 2 1
4
2 4 1 3
5
2 5 1 4 3
1
1 2 1
1
1 3 2
3
2 4 1
2 3 1
1 3 2
4
2 4 2
1 5 3
1 2 1
1 3 1
在线编程 IDE
建议全屏模式获得最佳体验
| 进入全屏编程 | Alt+E |
| 递交评测 | Ctrl+Enter |
| 注释/取消注释 | Ctrl+/ |
| 缩放字体 | Ctrl+滚轮 |