#HK5395. 「ROI 2014 Day 1」彼得与机器人

「ROI 2014 Day 1」彼得与机器人

题目描述

译自 ROI 2014 Day1 T3. Петя и Робот

彼得的书架上摆放着 nn 本笔记本,里面记录了他所有的创意想法。这些笔记本编号为从 11nn 的不同整数。彼得有一个习惯的摆放顺序(不一定是按编号顺序),他不喜欢别人打乱这个顺序。彼得购买了一个特殊的机器人,这个机器人能够记住笔记本的摆放顺序,并计算出该顺序中的错序数量。

机器人认为,如果一本编号较小的笔记本摆放在编号较大的笔记本右侧,则这两本笔记本构成一个错序。例如,在摆放顺序 (2,1,5,3,4)(2, 1, 5, 3, 4) 中,错序对有 (2,1)(2, 1)(5,3)(5, 3)(5,4)(5, 4) 三对,因此错序数量为 33

在房间装修后,彼得忘记了笔记本的习惯摆放顺序,想要恢复原来的顺序。机器人保存了这个顺序,但它只会报告保存顺序中的错序数量。彼得可以请求机器人交换保存顺序中两本笔记本的位置。每次请求后,机器人会保存新的顺序并报告新顺序中的错序数量。彼得可以重复进行这样的请求,直到他认为自己收集了足够的信息来恢复习惯摆放顺序。

你需要编写一个程序,通过与机器人交互,恢复彼得笔记本的习惯摆放顺序。

交互方式

这是一个交互题。在运行过程中,你的程序将通过标准输入/输出流与评测程序交互,评测程序模拟机器人的行为。

首先,你的程序应从标准输入流读取两个整数 nnmm,分别表示彼得的笔记本数量以及习惯摆放顺序中的错序数量。

随后,你的程序与评测程序的交互协议如下:

  • 要交换两本笔记本的位置,你的程序应向标准输出流输出一个请求,格式为:swap i j,其中 iijj (1i,jn,ij)(1 \leq i, j \leq n, i \neq j) 是要交换的笔记本位置编号。之后,程序应从标准输入流读取一个整数,即交换后顺序中的错序数量。你的程序最多可以进行 300,000300,000 次此类请求。
  • 当你的程序确定已经恢复了习惯摆放顺序时,应输出该顺序,格式为:answer p,其中 pp 是由 nn 个不同整数(范围从 11nn)组成的序列,表示恢复的摆放顺序,然后程序应结束运行。

交换请求和输出习惯摆放顺序的语句必须以换行符结尾,并刷新输出流缓冲区。为此,可以在 Pascal/Delphi 中使用 flush(output);在 C/C++ 中使用 fflush(stdout)cout.flush()

3 2
1
0

swap 1 3
swap 3 2
answer 2 3 1

数据范围与提示

详细子任务附加限制及分值如下表所示:

子任务 分值 附加限制 说明
11 3030 1n1001 \leq n \leq 100 需通过该子任务所有测试点才可获得分数
22 2020 1n80001 \leq n \leq 8000 每个测试点独立评分
33 3030 1n600001 \leq n \leq 60000
44 2020 1n1000001 \leq n \leq 100000