#P15517. [Nordic2022]Quark Microscopy

    ID: 14732 交互题 1000ms 1024MiB 尝试: 1 已通过: 1 难度: 9 上传者: 标签>CF2600数学二分构造模拟算法基础

[Nordic2022]Quark Microscopy

这下可惨了!

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

NN 个夸克分布在一条 11 米长的线段上。由于 11 米等于 101810^{18} 阿米,所以每个夸克的位置都是 [1,1018][1,10^{18}] 之间的正整数。

幸运的是,你有一个很精确但有点奇怪的夸克显微镜。它能够检测并测量邻近的夸克。然而由于量子效应,它无法直接告诉你离测量位置最近的夸克的位置,而是会告诉你:

  • 离测量位置第二近的夸克的距离;
  • 离测量位置这个距离的夸克数量。

更准确地说,你可以在线段上的位置 xx 处进行测量。

对于每次测量,把所有夸克到 xx 的距离按升序排序,记为:

d1,d2,,dN.d_1,d_2,\ldots,d_N.

交互库会返回:

  • d2d_2
  • 满足 di=d2d_i=d_2ii 的数量,这个数量只会是 1122

在进行足够多次测量后,你需要回答所有夸克所在的位置。

由于 Pauli 不相容原理,夸克的位置不会重合。

交互格式

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

首先读入两个整数 N,TN,T,表示夸克数量和子任务编号。

接下来可以进行若干次询问或给出答案。

询问

输出:

? x

表示在位置 xx 处进行测量。

你需要保证:

1018x2×1018.-10^{18}\le x\le 2\times 10^{18}.

交互库会返回两个整数 r,mr,m

  • rr 表示离 xx 第二近的夸克的距离;
  • mm 表示距离 xx 恰好为 rr 的夸克数量,mm 只会是 1122

回答

输出:

! a_1 a_2 ... a_N

表示你认为夸克的位置分别是 a1,a2,,aNa_1,a_2,\ldots,a_N

你可以以任意顺序输出这些位置。

回答后,不应继续进行询问。

你需要保证:

1ai1018.1\le a_i\le 10^{18}.

刷新缓冲区

交互过程中,每次输出后都需要刷新缓冲区。

常见语言的刷新方式:

  • C++:fflush(stdout)cout.flush()
  • C++ 中使用 endl 换行也会刷新;
  • C:fflush(stdout)

数据范围

  • 3N1003\le N\le 100
  • 1T31\le T\le 3
  • 所有夸克位置互不相同;
  • 所有夸克位置均为 [1,1018][1,10^{18}] 内的整数。

评分方式

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

其中 rr 与你在该子任务中的最大询问次数 QQ 有关:

查询次数 QQ rr
Q>15000Q>15000 00
15000Q>560015000\ge Q>5600 0.40.4
5600Q>35005600\ge Q>3500 0.60.6
3500Q>24003500\ge Q>2400 0.80.8
Q2400Q\le 2400 1.01.0