CF1583D Omkar and the Meaning of Life 做题记录

这是一道交互题。

原来生命的意义是一个 nn (2n1002 \leq n \leq 100) 的排列。 创造了世上所有生命的 Omkar 知道这个排列,他允许你在有限的询问次数内查询出这个排列是什么。

每一次询问你可以给出一个序列 a1,a2,,ana_1, a_2, \ldots, a_n (1a1,a2,,ann1\le a_1,a_2,\ldots,a_n \le n) 来对 Omkar 进行询问。 $ a $ 序列不一定要是一个排列。之后 Omkar 会逐个将 aia_ipip_i 相加得到一个新的序列 ss ,即对于每个 jj (1jn1\le j \le n) ,sj=pj+ajs_j = p_j + a_j 。最后 ss 序列中可能会出现一些相同的数,你将读入 Omkar 告诉你的第一个出现相同数的位置。如果没有相同的数出现,你将读入数字 00

你最多只能进行 2n2n 次询问。

显然对于 ai=aja_i=a_j 的两个位置 i,ji,j,它们一定对答案没有贡献,那么考虑询问形如 {2,2,,2,1,2,2,2}\{2,2,\dots,2,1,2,2\dots,2\} 的第 ii 位为 11,其它位为 22 的序列 aa

记询问只有第 ii 位为 11aa 的答案为 res1ires1_i,那么 res1ires1_i 显然有三种情况:

  • res1i<ires1_i<i,那么 pip_i 的前驱是 pres1ip_{res1_i}
  • res1i=ires1_i=i,那么 pip_i 的前驱在 [i+1,n][i+1,n] 中;
  • res1i=0res1_i=0,那么 pi=1p_i=1

接下来考虑获取每个位置的后继以解决 pip_i 的前驱不确定的情况。类似的,考虑询问形如 {1,1,,1,2,1,1,1}\{1,1,\dots,1,2,1,1\dots,1\} 的第 ii 位为 22,其它位为 11 的序列 aa

记询问只有第 ii 位为 11aa 的答案为 res2ires2_i,那么 res2ires2_i 显然也有三种情况:

  • res2i<ires2_i<i,那么 pip_i 的后继是 pres2ip_{res2_i}
  • res2i=ires2_i=i,那么 pip_i 的后继在 [i+1,n][i+1,n] 中;
  • res2i=0res2_i=0,那么 pi=1p_i=1

这样我们就用 2n2n 次操作确定了每个 pip_i 的前驱后继,自然也确定了 pp