#L4936. 「EGOI2021」姐妹分饼干

「EGOI2021」姐妹分饼干

题目描述

这是一道交互题。你的程序将通过标准输入输出与交互器进行交互。


索菲正在为她的双胞胎孩子准备生日派对。双胞胎非常喜欢饼干。为了他们的生日,他们想尝试一些新奇的东西:来自独特饼干美味公司(UCTC)的饼干。

UCTC 生产的每块饼干都有一个介于 11101610^{16} 之间的整数美味值。由于索菲的双胞胎会互相嫉妒,他们每个人必须收到美味值总和相同的饼干。

UCTC 只接受正好 nn 块饼干的订单。在每次订单中,客户需要指定想要的 nn 块饼干的美味值。

正如公司名字所示,独特饼干美味公司拒绝为同一客户生产两块美味值相同的饼干。索菲必须确保她在同一订单或不同订单中不会重复订购相同的美味值。索菲之前从未在 UCTC 购买过饼干,因此她可以订购每种可用的美味值一次。

还有一个难题:众所周知,UCTC 的配送服务非常糟糕。每次客户订购 nn 块饼干,只有其中一块会真正送达客户手中,其余的都被配送服务员工在途中吃掉了。客户无法控制哪块饼干最终会被送达。

由于生日即将来临,索菲最多只能下 101101 次订单。你的任务是帮助她。


交互方式

你的程序需要按照以下步骤执行:

  1. 从标准输入读取值 nn
  2. 最多 101101 次:
    • 向标准输出输出一行,描述一个包含 nn 块饼干的订单。
    • 从标准输入读取你收到的饼干的美味值。保证这个值是你当前订单中 nn 个美味值之一。
  3. 输出三行,描述一种将你收到的饼干分配给双胞胎的有效方式。

订购饼干

输出一行,格式为:

? t₁ t₂ ... tₙ

表示你想订购的饼干的美味值。每个整数前有一个空格。

记住:你最多可以下 101101 次订单,且不能重复使用相同的美味值。


分配饼干

当你收到足够多的饼干后,输出最后三行:

! m k
v₁ v₂ ... vₘ
w₁ w₂ ... wₖ

其中:

  • m,k>0m, k > 0,分别表示第一个和第二个双胞胎应收到的饼干数量
  • 第二行包含 mm 个用空格分隔的整数,表示第一个双胞胎收到的饼干的美味值
  • 第三行包含 kk 个用空格分隔的整数,表示第二个双胞胎收到的饼干的美味值

输出必须满足以下条件

  • 每个双胞胎至少收到一块饼干
  • 两个双胞胎收到的饼干美味值总和相同
  • 只能使用你实际收到的饼干
  • 每块饼干最多只能分配给一个双胞胎

刷新输出

每次你的程序向标准输出输出一行或多行后,必须刷新输出流

刷新输出的方法示例:

  • 在 C++ 中:fflush(stdout);std::cout << std::flush;
  • 在 Java 中:System.out.flush();
  • 在 Python 中:sys.stdout.flush()

样例 1

输入

1
13
7
31
12
5
3

输出

? 13
? 7
? 31
? 12
? 5
? 3
! 2 3
7 13
12 5 3

样例 2

输入

2
7
2
5

输出

? 3 7
? 2 8
? 1 5
! 2 1
2 5
7

数据范围与提示

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

子任务 分值 附加限制
1 8 n=1n = 1
2 9 1n21 \leq n \leq 2
3 18 1n251 \leq n \leq 25
4 16 1n2001 \leq n \leq 200
5 13 1n10001 \leq n \leq 1000
6 36 1n50001 \leq n \leq 5000