【题目描述】
你有一个长度为 n 的排列 p 和一个参数 m ,你想通过一些操作把他变成 q
一次操作可以把排列中一个长度为 m 的子串移动到另一个位置
你需要判断是否能实现目标,若能,请用较少(详见 【数据范围与限制】)的操作数
构造出一组解
【输入格式】
从文件 na.in 中读入数据
第一行一个正整数 T 表示测试组数
对于每组数据,第一行两个正整数 n, m 意义见题目描述
第二行 n 个数,第 i 个数表示 pi
第三行 n 个数,第 i 个数表示 qi
【输出格式】
输出到文件 na.out 中
对于每组数据,先输出一个字符串 YES 或 NO ,表示能否达成目标
若能,则再输出一行一个整数 k 为你构造的解的操作数,接着输出 k 行,每行两个数 a, b ,表示首先将 $[a, a + m − 1]$ 这一段拿出来,然后插入到去除了 $[a, a + m − 1]$ 后的序列的第 b − 1 和 b 之间
【样例 1 输入】
1 3 2 2 1 3 2 1 4 2 1 5 4 2 6 1 2 3 4 7 1 2 4 3 8 3 2 9 2 1 3 10 1 3 2【样例 1 输出】
1 YES 2 0 3 NO 4 YES 5 2 6 1 2 7 1 2【样例 2】 见选手目录下的 na/na2.in 与 na/na2.ans ,注意 na2.ans 只含有 YES 和 NO
.本 .题 .下 .发 checker.cpp , .在 .运 .行 .时 < ans > .中 .只 .需 .包 .含 YES .和 NO .即 .可
【数据范围与限制】
对于 100% 的数据,$1 ≤ T ≤ 10, 1 ≤ m ≤ n ≤ 10^2$ ,保证 p, q 为排列
对于一组数据:
如果程序未能正常运行(如超时)或者构造方案不合法,你将获得 0 分
否则,设 k 为你的构造步数:
• 若 $k ≤ n^3$ 则可以得到满分
• $k ≤ 2 × n^3 $则可以得到 $20%$ 的分数
• 否则得 0 分
一个子任务的得分为所有测试点的所有数据得分的最小值
本题开启捆绑测试,子任务及其分数分配如下:
子任务编号 | 数据范围 | 特殊性质 | 子任务分值 |
---|---|---|---|
1 | m ≥ n − 1 | 无 | 5 |
2 | n ≤ 10 | 无 | 10 |
3 | m ≤ 2 | 无 | 10 |
4 | $$m ≤ ⌊\frac{n-1}{3}⌋$$ | 无 | 15 |
5 | $$m ≤ ⌊\frac{n-1}{2}⌋$$ | 无 | 15 |
6 | 无限制 | m为奇数 | 20 |
7 | 无限制 | 无 | 25 |