QOJ.ac

QOJ

حد الوقت: 1 s حد الذاكرة: 256 MB مجموع النقاط: 100 تفاعلية

#10395. 双胞胎饼干

الإحصائيات

这是一个交互式问题。你的程序将通过交替向标准输出写入消息并从标准输入读取消息的方式与评测机进行通信。

Sophie 正在为她的双胞胎准备生日派对。双胞胎非常喜欢饼干。为了庆祝生日,他们想尝试一些新鲜的东西:来自独特饼干美味公司(Unique Cookie Tastiness Company,简称 UCTC)的饼干。

UCTC 生产的每块饼干都有一个介于 $1$ 到 $10^{16}$ 之间的整数美味值(包含边界)。由于 Sophie 的双胞胎会互相嫉妒,他们每个人都必须收到美味值之和相等的饼干。

UCTC 只接受恰好包含 $n$ 块饼干的订单。在每个订单中,客户需要指定他们想要的每块饼干的美味值。

秉承其名称的含义,独特饼干美味公司拒绝为同一位客户生产两块美味值相同的饼干。Sophie 必须确保她从不订购两次相同的美味值——无论是在同一个订单中,还是在两个不同的订单中。Sophie 以前从未从 UCTC 购买过饼干,因此她可以将每种可用的美味值各订购一次。

Sophie 的面前还有一个障碍:众所周知,UCTC 的快递服务非常糟糕。每当客户订购 $n$ 块饼干时,只有其中 $1$ 块饼干会真正送达客户手中。其余的饼干在运输过程中被快递公司的员工吃掉了。客户无法影响最终送达给她的 $n$ 块饼干中的哪一块。

由于生日临近,Sophie 最多只能进行 $101$ 次订单。你的任务是帮助她。

更具体地说,你需要执行以下操作:

  1. 首先,订购饼干。你可以进行最多 $101$ 次订单,每次订单包含恰好 $n$ 个期望的美味值。你一次进行一个订单。在每次订单后,你会立即获知你实际收到的那块饼干的美味值。

    请记住,你不能多次使用相同的美味值,即使是在多个订单中也是如此。(特别地,如果你订购了一块具有某种美味值 $t$ 的饼干,但它没有送达,你不能再次订购具有相同美味值的饼干。)

  2. 然后,分配饼干。一旦你收到了足够的饼干,你应该在双胞胎之间分配部分收到的饼干。两个双胞胎都应该至少收到一块饼干,并且每个双胞胎收到的饼干的美味值总和必须相等。你不需要使用你收到的所有饼干!

输出格式

每次你的程序向标准输出输出一行或多行内容时,你必须紧接着刷新输出流。这对于确保你输出的数据立即到达评测机是必要的。

实现此操作的示例:

  • 在 C++ 中,有多种选择:
    • fflush(stdout);
    • std::cout << std::flush;
    • std::cout << std::endl;(注意这还会打印一个额外的换行符)
    • 读取 std::cin 也会刷新输出
  • 在 Java 中,你可以使用 System.out.flush()
  • 在 Python 中,你可以使用 sys.stdout.flush()

交互

你的程序应执行以下操作序列:

  1. 从标准输入读取值 $n$。
  2. 最多 $101$ 次:
    1. 首先,向标准输出写入一行,描述一个包含 $n$ 个饼干的订单。
    2. 然后,从标准输入读取你收到的饼干的美味值。 保证该值在当前订单的 $n$ 个值之中。
  3. 输出三行,描述一种将你收到的部分饼干分给双胞胎的有效方案。

评测机将把每个整数写在单独的一行上。

要订购饼干,请输出一行以 ? 开头,后跟 $n$ 个整数:你想要订购的饼干的美味值。在每个整数前输出一个空格。

请记住,你最多可以进行 $101$ 次订单,并且不允许两次使用相同的美味值。

一旦你订购了足够的饼干,输出最后三行,描述 Sophie 应该给双胞胎哪些饼干。

第一行应采用 ! m k 的形式,其中 $m, k > 0$:分别表示第一个双胞胎和第二个双胞胎应该收到的饼干数量。

第二行应包含 $m$ 个由单个空格分隔的整数:第一个双胞胎应该收到的饼干的美味值。

类似地,第三行应包含 $k$ 个由单个空格分隔的整数:第二个双胞胎应该收到的饼干的美味值。

输出必须满足以下条件:

  1. 每个双胞胎至少应收到一块饼干。
  2. 每个双胞胎收到的饼干美味值总和相等。
  3. 只能使用你在订单后实际收到的饼干。
  4. 每块饼干最多只能给其中一个双胞胎。

任何满足这些条件的输出都将被接受。特别地,你可以以任何顺序输出选定的饼干。

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

子任务

  • 子任务 1(8 分):$n = 1$
  • 子任务 2(9 分):$1 \le n \le 2$
  • 子任务 3(18 分):$1 \le n \le 25$
  • 子任务 4(16 分):$1 \le n \le 200$
  • 子任务 5(13 分):$1 \le n \le 1000$
  • 子任务 6(36 分):$1 \le n \le 5000$

样例

样例输入 1

1
13
7
31
12
5
3

样例输出 1

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

样例输入 2

2
7
2
5

样例输出 2

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

说明

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

评测机任意选择返回哪块饼干。这意味着评测机在某些测试中可能是自适应的,但在其他测试中也可能随机选择饼干。特别地,对于 $n = 2$,如果你执行与第二个示例相同的订单序列,你可能会收到一组不同的饼干。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.