Logo Universal Online Judge

UOJ

时间限制:1 s 空间限制:512 MB

#1068. 钠(na)

Statistics

【题目描述】
你有一个长度为 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