#P7109. 滴水不漏

    ID: 6009 远端评测题 1000ms 250MiB 尝试: 0 已通过: 0 难度: 5 上传者: 标签>洛谷原创交互题Special JudgeO2优化二分查找洛谷月赛

滴水不漏

题目背景

这是一道 IO 交互题。

题目描述

Gnar 购买了 nn 个水缸,其中第 ii 个水缸的容积为 ii 且因不明原因初始装有 aia_i0aii0 \le a_i \le i)单位的水。

好奇的 Gnar 想知道每个水缸装有的水量,但肉眼观察显然不可行,他希望你能帮他计算解决这个难题。

Gnar 唯一能替你执行的操作是,由你先指定 i,ji, j1i,jn1 \le i, j \le n),然后:

  • iji \neq j,滴水不漏地将第 ii 个水缸的水往第 jj 个水缸倒,直到第 ii 个水缸的水被倒完或第 jj 个水缸已满。Gnar 会告诉你操作后第 jj 个水缸是否是满的。注意倒水的影响会保留而不是恢复到操作前。
  • i=ji = j,Gnar 做不到让一个水缸的水往自己倒,他会直接告诉你当前第 jj 个水缸是否是满的。

Gnar 只肯接受最多 2000020000 次操作,否则他会认为你在调戏他!

你的任务是利用不超过 2000020000 次操作 Gnar 告诉的结果,完整求出最初的 a1,a2,,ana_1,a_2,\ldots,a_n

当然 Gnar 不会动手脚,你所求的 a1,a2,,ana_1,a_2,\ldots,a_n 在操作前已经存在,不随操作动态生成。

输入格式

输入单个正整数水缸个数 nn 以开始交互。

输出格式

在你确定答案后,用 ! a1 a2 ... an 的形式输出一行以结束交互。

交互格式

交互过程中,用 ? i j (1i,jn)(1 \le i,j \le n) 的形式输出一行以执行一次操作。然后你应输入一个布尔值,即操作的返回值 xx。若 x=0x = 0,表示第 jj 个水缸未满;若 x=1x = 1,表示第 jj 个水缸已满。

上述的所有输入都应从标准输入中读入,所有输出都应向标准输出中输出。输出一行后必须清空缓冲区,否则你的评测将被判为 Time Limit Exceeded。清空缓冲区方式如下:

  • 在 C++ 中,使用 fflush(stdout)cout.flush()
  • 在 Pascal 中,使用 flush(output)
  • 在 Python 中,使用 stdout.flush()
  • 其他语言请自行查阅文档。

如果你的输出格式错误,或执行超过 2000020000 次操作,你的评测将被判为 Wrong Answer。

2

0

1

0

? 1 1

? 2 1

? 1 2

! 0 1

提示

【样例解释 #1】

样例示意了一种可能的交互过程。

初始两个水缸中分别装有 0,10,1 单位的水。

第一次操作,由于 i=ji = j,你直接得知 x=0x = 0 即第一个水缸未满。

第二次操作后两个水缸装有水量分别为 1,01,0,而你得知 x=1x=1 即第一个水缸当前已满。

第三次操作后两个水缸装有水量分别为 0,10,1,而你得知 x=0x=0 即第二个水缸当前未满。

注意过程中确切水量并不传达给你,但是通过返回值 xx 你足够唯一确定 a1=0a_1 = 0a2=1a_2 = 1


【数据规模与约定】

本题采用捆绑测试。你必须通过 Subtask 中所有的测试点才能获得该 Subtask 的分数。

  • Subtask #1 (8 points):n=2n = 2
  • Subtask #2 (17 points):n10n \le 10
  • Subtask #3 (15 points):n100n \le 100
  • Subtask #4 (15 points):ai1a_i \le 1
  • Subtask #5 (25 points):n500n \le 500
  • Subtask #6 (20 points):无特殊限制。

对于所有的数据,保证 2n10002 \le n \le 10000aii0 \le a_i \le i