#P10645. [NordicOI 2022] 夸克显微镜 Quark Microscopy

[NordicOI 2022] 夸克显微镜 Quark Microscopy

题目背景

译自 Nordic Olympiad in Informatics 2022 Quark Microscopy。如果发现交互库锅了请联系搬题人 qvq。

1s,1G\texttt{1s,1G}

题目描述

这下可惨了!Niels 珍爱的原子被宇宙射线击中,分裂成了许多夸克。Niels 迫切地想要找到这些夸克,然后将它们拼起来。所以,他找来了你来帮忙。

NN 个夸克分布在一条 11 米(101810^{18} 阿米)长的线段上。幸运的是,你有一个很精确,但有点奇怪的夸克显微镜,它能够检测并测量邻近的夸克。然而由于量子效应,它无法直接告诉你离测量位置最近的夸克的位置,而是会告诉你离测量位置第二近的夸克的位置,以及离测量位置第二近的夸克的数量。

更为准确地说,你可以在线段上的位置 xx 处进行测量。对于每次测量,每个夸克距 xx 的距离将会被测出并升序排序,记为 d1,d2,,dNd_1,d_2,\cdots,d_N。你会得到 d2d_2,和满足 di=d2d_i=d_2ii 的数量(只会是 1122)。在进行足够多次测量后,你需要回答每个夸克所在的位置。

每个夸克的位置都是介于 [1,1018][1,10^{18}] 间的正整数(单位:阿米),从线段的起始位置开始计算。由于 Pauli 不相容原理,夸克的位置不会重合。

输入格式

你的程序与交互库通过标准输入输出流交互。

第一行,两个正整数 N,TN,T,表示夸克的数量和子任务编号。

接下来,你的程序开始与交互库交互:

  • ? x:询问离 xx 第二远的夸克。交互库会返回两个整数 r,mr,m,其中 rr 是第二远夸克的距离,mm 是距离 xxrr 的夸克的数量(只会是 1122)。你需要保证 1018x2×1018-10^{18}\le x\le 2\times 10^{18}

  • ! a1a_1 a2a_2 \cdots aNa_N:回答夸克的位置。你可以以任意顺序给出这些夸克的位置。回答后,不应有多余的询问。你需要保证 1ai10181\le a_i\le 10^{18}

注意:在交互过程中,你需要在输出后刷新缓存区。 下面是一些常见语言的刷新缓存区方式:

  • C++:fflush(stdout)cout.flush()。特别地,利用 std::endl 换行也会刷新缓冲区。
  • C:fflush(stdout)

输出格式

见【输出格式】。

3 3

6 1

4 1

1 2

? 5

? 15

? 11

! 11 10 12
3 1

2 1

1 2

2 1

45 1

? 1

? 2

? 3

? 47

! 1 3 92

提示

数据范围

  • 3N1003\le N\le 100
  • 1T31\le T\le 3

评分方式

子任务编号 得分 限制
11 40r40\cdot r 存在一个在位置 11 上的夸克
22 夸克的位置均为偶数
33 20r20\cdot r 无额外限制

其中 rr 为一个常数。记某个子任务中你查询的最大次数为 QQ,则 rr 的值见以下表格:

QQ 的限制 r=r=
Q>15000Q\gt 15\, 000 00
15000Q>560015\, 000\ge Q\gt 5\, 600 0.40.4
5600Q>35005\, 600\ge Q\gt 3\, 500 0.60.6
3500Q>24003\, 500\ge Q\gt 2\, 400 0.80.8
Q2400Q\le 2\, 400 1.01.0

为了方便选手测试,我们提供了 testing_tools.py,可在附件下载,使用说明见文件头。