#HK4936. 「EGOI2021」姐妹分饼干

「EGOI2021」姐妹分饼干

题目描述

题目译自 European Girls' Olympiad in Informatics 2021 Day1 T3. Twin Cookies

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

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

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

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

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

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

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

具体来说,你需要完成以下步骤:

  1. 订购饼干:你最多可以下 101101 次订单,每次订单包含正好 nn 个你希望的美味值。每次下单后,你会立即收到实际送达的饼干的美味值。
    注意:你不能多次使用相同的美味值,即使在不同的订单中也不行。(例如,如果你在某次订单中订购了美味值 tt 的饼干但未收到,你也不能再次订购相同美味值的饼干。)
  2. 分配饼干:当你收到足够多的饼干后,你需要将收到的饼干分配给双胞胎。每个双胞胎至少需要收到一块饼干,且他们收到的饼干美味值总和必须相同。你不必使用所有收到的饼干!

交互方式

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

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

评分程序会将每个整数输出到单独的一行。

订购饼干:输出一行,格式为 ? 后跟 nn 个整数,表示你想订购的饼干的美味值。每个整数前有一个空格。

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

分配饼干:当你收到足够多的饼干后,输出最后三行,描述索菲应如何将饼干分配给双胞胎。

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

输出必须满足以下条件:

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

只要满足这些条件的输出都会被接受。你可以按任意顺序输出选中的饼干。

在输出最后三行后,再次刷新输出流,然后正常终止你的程序。

每次你的程序向标准输出输出一行或多行后,必须刷新输出流。这是为了确保你输出的数据立即到达评分程序。

刷新输出的方法示例:

  • 在 C++ 中,有多种方式:
    • fflush(stdout);
    • std::cout << std::flush;
    • std::cout << std::endl;(注意:这会额外输出一个换行符)
    • std::cin 读取输入时也会自动刷新输出
  • 在 Java 中,可以使用 System.out.flush()
  • 在 Python 中,可以使用 sys.stdout.flush()
1
13
7
31
12
5
3
? 13
? 7
? 31
? 12
? 5
? 3
! 2 3
7 13
12 5 3
2
7
2
5
? 3 7
? 2 8
? 1 5
! 2 1
2 5
7

示例评测程序

示例的输入和输出应逐行阅读。你的程序交替从标准输入读取一个值,并向标准输出输出一行(或在最后输出三行)。

评分程序会任意选择返回哪块饼干。这意味着在某些测试中,评分程序可能根据你的订单自适应地选择饼干,而在其他测试中可能随机选择。特别地,对于 n=2n=2,如果你按照第二个示例的订单序列进行操作,可能会收到不同的饼干集合。

数据范围与提示

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

子任务 分值 附加限制
11 88 n=1n=1
22 99 1n21 \leq n \leq 2
33 1818 1n251 \leq n \leq 25
44 1616 1n2001 \leq n \leq 200
55 1313 1n10001 \leq n \leq 1000
66 3636 1n50001 \leq n \leq 5000