#P17038. [NWERC 2021] Boredom Buster

[NWERC 2021] Boredom Buster

背景

译自 Northwestern Europe Regional Contest (NWERC) 2021 Problem B。

原题许可协议为 CC BY-SA。

题目描述

你独自被困在一间小木屋里,外面正下着雨。你无聊得快疯了,唯一能打发时间的东西是一副 Memory 记忆牌。一个人玩 Memory 并不太有趣,但你设计了一个单人变体,它不仅需要好的记忆力,也需要策略。

游戏规则如下:你有一副洗乱的 nn 张牌,其中 nn 为偶数,每张牌上写有一个从 11n2\frac{n}{2} 的数字。每个数字恰好出现两张牌。牌面朝下放在桌上,你的目标是确定每张牌上写着什么数字。

每一步,你拿起两张牌。在翻开它们之前,你会随机打乱这两张牌,使得你不知道哪张牌原本在哪里。然后你查看这两张牌。之后,在把它们放回原来的两个位置之前,你再次将它们牌面朝下随机打乱。这样一来,你知道这两个位置上的数字以及它们所在的位置,但不知道最后哪张牌落在哪个位置,甚至不知道最初哪张牌来自哪个位置。

你的任务是编写一个程序来赢下这个游戏。

交互格式

这是一道交互题。你的程序会与一个 交互器 一起运行;交互器读取你程序的标准输出,并向你程序的标准输入写入内容。交互过程必须遵循以下协议:

  • 交互器首先发送一个整数 nn2n1052 \leq n \leq 10^5nn 为偶数)。只有在样例中,nn 才可能不等于 10510^5
  • 之后,你的程序可以反复输出两个整数 xxyy1x,yn1 \leq x,y \leq nxyx \neq y),并在前面加上 ?
  • 交互器返回两个整数 aabb1a,bn21 \leq a,b \leq \frac{n}{2}),表示查询之后要么第 xx 张牌为 aa 且第 yy 张牌为 bb,要么第 xx 张牌为 bb 且第 yy 张牌为 aa
  • 当你准备输出答案时,输出 !,后面跟着 nn 个整数 a1,a2,,ana_1,a_2,\ldots,a_n,其中 aia_i 表示 输出时刻ii 张牌上的数字。

你最多可以使用 9200092\,000 步。输出答案不计为一步。

交互器不是自适应的。牌的初始位置在任何交互发生前就已由交互器确定。当你进行一步操作时,交互器会在展示给你之前以及放回去之前,都分别将这两张牌均匀随机地打乱。初始牌面保证是 1,1,2,2,,n2,n21,1,2,2,\ldots,\frac{n}{2},\frac{n}{2} 的一个随机排列。

你的程序会在恰好 100100 个测试用例上运行,每个测试用例都有 n=105n=10^5

每次写入后请确保刷新输出缓冲区。题包中提供了一个测试工具,帮助你调试程序。

6
3 2 
2 3 
1 1 
3 3 
? 2 1
? 5 3
? 6 4
? 1 3
! 3 2 3 1 2 1

提示

【数据规模与约定】

对于所有数据,2n1052 \leq n \leq 10^5nn 为偶数;正式测试中恰好有 100100 个测试用例,且每个测试用例 n=105n=10^5。最多允许 9200092\,000 步,输出答案不计入步数。