#P8197. [传智杯 #4 决赛] 排排队
[传智杯 #4 决赛] 排排队
题目描述
cyq 在 tsyz 担任了体育老师,负责排队一事。
在 tsyz 中,每个人都有一个身高 ,并且只有相邻的两个人可以交换位置。cyq 带领的队伍有 个人,他现在要给大家排队形。
给定一个长度为 的序列 ,一个队形被认为美观,当且仅当对于所有的 ,。cyq 想知道,他能否让大家的队形变得美观,并且交换相邻两个人的次数不超过 次。这个问题把 难住了,请你帮他来解决这个问题,如果存在合法的交换方案,输出 YES
,并给出一组方案;否则,输出 NO
。
输入格式
本题单测试点内有多组测试数据。
第一行是一个整数 ,表示数据组数,对于每组数据:
第一行是一个整数,表示队伍的长度 。
第二行有 个整数,第 个整数表示第 个人的身高 。
第三行有 个整数,第 个整数表示美观队形里第 个人的身高 。
输出格式
对每组数据依次分别输出答案。
对于每组数据,若存在一种方案,则在第一行输出一个 YES
,否则输出一个 NO
。
如果输出 YES
,下面则输出若干行每行两个整数 ,表示第 个同学和第 个同学交换位置,显然 。在交换完成后,你还需要输出一行 0 0
表示你的操作结束了,请注意数组的下标从 1 开始编号至 。
如果输出 NO
,则接下来什么都不需要输出。
请特别注意,对于每组数据,你的操作次数不能超过 (不包括 0 0
一行),否则将得到 WA(Wrong Answer) 的结果。
3
4
1 2 2 3
3 2 2 1
3
1 2 3
1 2 4
1
1
1
YES
4 3
2 3
1 2
3 2
3 4
0 0
NO
YES
0 0
提示
数据规模与约定
对于全部的测试点,保证 ,,,且各个测试点 之和不超过 ,即 。
提示
- 请注意大量的输出输出对程序效率造成的影响,不要频繁刷新缓冲区。例如,对于使用
std::cout
的 C++ 选手,请使用'\n'
而不是std::endl
来换行;对于 java 选手,请选择高效率的输出方式,如使用 PrintWriter;python 选手可以正常的使用 print 而无需考虑效率问题。 - 请按照输出格式的要求输出您的答案,如果格式不符合要求,返回的评测信息将可能是 TLE、RE、WA、UKE 等任何结果。
C++ 语言的高效输出样例
#include <iostream>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
for (int i = 1; i <= 5; ++i) {
std::cout << i << '\n'; // 注意这里不能使用 std::endl
}
}
Java 语言的高效输出样例
import java.io.PrintWriter;
public class Main {
public static void main(String[] args) {
PrintWriter ot = new PrintWriter(System.out);
for (int i = 1; i <= 5; ++i) {
ot.println(i);
}
ot.flush(); // 请务必保证在程序结束时运行本条语句,否则在缓冲区的内容无法输出
}
}