CF2127G2.Inter Active (Hard Version)

NOI/NOI+/CTSC

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

这是该问题的困难版本。不同之处在于,在本版本中,你最多可以进行 10⋅n10\cdot n 次查询。只有在你解决了所有版本的问题后,才可以进行 Hack。

Ali 非常喜欢 Bahamin 的礼物(见 E 题),以至于他非法从 Qazvin 前往利物浦,想让足球运动员为礼物签名。现在国际刑警正在追捕他,但他们提出了一个交易:只要他解决一个问题,就可以留在利物浦。但由于他现在正在体育场,无法自己解决,于是他请求你帮忙。

这是一个交互题。

有一个长度为 n≥4n\ge 4 的隐藏排列 pp,其中对于每个 1≤i≤n1 \leq i \leq n,都有 pi≠ip_i \neq i。

一开始,你需要给评测机输出一个正整数 kk,满足 1≤k≤n1 \leq k \leq n,且在之后的所有查询中 kk 都保持不变。然后你需要通过若干次查询找出排列 pp。

每次查询时,你需要给评测机一个排列 q1,q2,…,qnq_1, q_2, \ldots, q_n。评测机会返回满足以下所有条件的有序对 (i,j)(i, j) 的数量:

  • i<ji < j;
  • pqi=qjp_{q_i} = q_j;
  • i≠ki \neq k(kk 是你一开始给出的常数)。

你会得到 nn,需要在最多 10⋅n10\cdot n 次查询内找出排列 pp。

∗^{\text{∗}}长度为 nn 的排列是一个包含 11 到 nn 的 nn 个互不相同整数的数组。例如,[2,3,1,5,4][2,3,1,5,4] 是一个排列,但 [1,2,2][1,2,2] 不是(22 出现了两次),[1,3,4][1,3,4] 也不是(n=3n=3 但有 44)。

输入格式

每个测试点包含多组测试数据。第一行包含测试数据组数 tt(1≤t≤5001 \le t \le 500)。每组测试数据描述如下。

每组测试数据的唯一一行包含一个整数 nn(4≤n≤1004 \leq n \leq 100),表示排列 pp 的长度。

保证所有测试数据中 n2n^2 的和不超过 10410^4。

输出格式

交互说明

每组测试数据的交互从读取整数 nn 开始。

然后你需要输出整数 kk(1≤k≤n1 \leq k \leq n)。这一步不计入查询次数。

之后你可以进行最多 10⋅n10\cdot n 次查询。

每次查询,输出一行,格式如下:

  • ? q1 q2 … qn\texttt{?}\,q_1\,q_2\,\ldots\,q_n

评测机会返回该查询的答案。

当你确定排列 pp 后,输出一行,格式如下:

  • ! p1 p2 … pn\texttt{!}\,p_1\,p_2\,\ldots\,p_n

这一步也不计入查询次数。

之后继续处理下一组测试数据,或在最后一组数据后终止程序。

交互器是非自适应的,即排列在你输出 kk 之前就已经确定。

如果你的程序进行了超过 10⋅n10\cdot n 次查询,应立即终止以获得 Wrong answer 判定。否则,程序继续从已关闭的流中读取数据可能会导致任意判定。

每次输出查询后,别忘了输出换行并刷新输出流。否则会因超时被判为 Idleness limit exceeded。

如果在任何交互步骤中读取到 −1-1 而不是有效数据,你的程序必须立即退出。这意味着你的程序因无效查询或其他错误而被判为 Wrong answer。如果未能退出,程序继续从已关闭的流中读取数据可能会导致任意判定。

Hack 格式

Hack 时使用如下格式:

每个测试点包含多组测试数据。第一行包含测试数据组数 tt(1≤t≤5001 \le t \leq 500)。每组测试数据描述如下。

每组测试数据的第一行包含一个整数 nn(4≤n≤1004 \leq n \leq 100),表示排列 pp 的长度。

第二行包含 nn 个整数 p1,p2,…,pnp_1, p_2, \ldots, p_n(1≤pi≤n1 \le p_i \le n,pi≠ip_i\ne i,所有 pip_i 互不相同),表示排列 pp。

保证所有测试数据中 n2n^2 的和不超过 10410^4。

∗^{\text{∗}}刷新输出流的方法:

  • C++:fflush(stdout) 或 cout.flush()
  • Python:sys.stdout.flush()
  • 其它语言请查阅相关文档。

输入输出样例

  • 输入#1

    2
    4
    
    
    1
    
    5
    
    
    1
    
    2

    输出#1

    1
    ? 1 2 3 4
    
    ! 3 1 4 2
    
    3
    ? 1 2 5 4 3
    
    ? 2 1 4 3 5
    
    ! 3 1 2 5 4

说明/提示

说明

在第一个测试点中,p=[3,1,4,2]p = [3, 1, 4, 2]。解答选择了 k=1k=1,然后查询排列 q=[1,2,3,4]q = [1, 2, 3, 4]。只有 (3,4)(3,4) 满足条件。

在第二个测试点中,p=[3,1,2,5,4]p = [3, 1, 2, 5, 4]。解答选择了 k=3k=3。

  • 查询排列 q=[1,2,5,4,3]q = [1, 2, 5, 4, 3],只有 (1,5)(1, 5) 满足条件。
  • 查询排列 q=[2,1,4,3,5]q = [2, 1, 4, 3, 5],(1,2)(1, 2) 和 (2,4)(2, 4) 满足条件。

由 ChatGPT 4.1 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页