CF2129C3.Interactive RBS (Hard Version)

提高+/省选-

通过率:0%

AC君温馨提醒

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

题目描述

这是一个交互题。

这是该题的困难版本。唯一的区别在于查询次数的限制。只有在所有版本都被解决后,才能进行 Hack。

有一个长度为 nn 的隐藏括号序列 ss,其中 ss 只包含 ’(’\texttt{'('} 和 ’)’\texttt{')'}。保证 ss 至少包含一个 ’(’\texttt{'('} 和一个 ’)’\texttt{')'}。

你可以通过询问来找出这个括号序列。每次询问的形式如下:你选择一个整数 kk 和任意的下标 i1,i2,…,iki_1, i_2, \ldots, i_k(1≤k≤10001 \le k \le 1000,1≤i1,i2,…,ik≤n1 \le i_1, i_2, \ldots, i_k \le n)。注意下标可以相同。接下来,你会收到一个由评测器计算的整数 f(si1si2…sik)f(s_{i_1}s_{i_2}\ldots s_{i_k})。

对于一个括号序列 tt,f(t)f(t) 表示 tt 中非空的正规括号子串的数量(子串必须是连续的)。例如,f("()())")=3f(\texttt{"()())"}) = 3。

一个括号序列被称为正规括号序列,当且仅当它可以通过以下方式构造:

  1. 空序列 ∅\varnothing 是正规括号序列。
  2. 如果括号序列 AA 是正规括号序列,则 (A)\mathtt{(}A\mathtt{)} 也是正规括号序列。
  3. 如果括号序列 AA 和 BB 都是正规括号序列,则它们的连接 ABAB 也是正规括号序列。

例如,序列 "(())()"\texttt{"(())()"}、"()"\texttt{"()"} 是正规括号序列,而 "(()"\texttt{"(()"} 和 "())("\texttt{"())("} 不是。

请在不超过 100100 次查询内找出序列 ss。

输入格式

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

输出格式

每组测试数据的第一行包含一个整数 nn(2≤n≤10002 \le n \le 1000)。此时,括号序列 ss 已经被选定。本题的交互器是非自适应的。也就是说,每组测试数据中的括号序列 ss 是固定的,在交互过程中不会改变。

每次询问,你需要选择一个整数 kk 和任意的下标 i1,i2,…,iki_1, i_2, \ldots, i_k(1≤k≤10001 \le k \le 1000,1≤i1,i2,…,ik≤n1 \le i_1, i_2, \ldots, i_k \le n),并输出如下格式的一行(不含引号):

  • “? k i1 i2 … ik?\ k\ i_1\ i_2\ \ldots\ i_k”

之后,你会收到一个整数 f(si1si2…sik)f(s_{i_1}s_{i_2}\ldots s_{i_k})。

你最多可以进行 100100 次这样的查询。

接下来,如果你的程序已经找到了括号序列 ss,请输出一行,格式如下(不含引号):

  • “! s1s2…sn!\ s_1s_2\ldots s_n”

注意,这一行不计入查询次数。

之后,进入下一组测试数据。

如果在一次交互中你的查询次数超过 100100,你的程序必须立即终止,否则会收到 Wrong Answer 判定。否则,你的程序会因为继续从已关闭的流中读取而收到任意判定。

每次输出查询或答案后,别忘了输出换行并刷新输出缓冲区,否则会收到 Idleness Limit Exceeded 判定。具体做法如下:

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

Hack

Hack 时请按照以下格式输入测试数据。

第一行包含测试组数 tt(1≤t≤201 \le t \le 20)。每组测试数据的描述如下。

每组测试数据的第一行包含一个整数 nn(2≤n≤10002 \le n \le 1000)。

每组测试数据的第二行包含一个括号序列 s1s2…sns_1 s_2\ldots s_n,其中 si=’(’s_i = \texttt{'('} 或 si=’)’s_i = \texttt{')'}。

括号序列 ss 必须至少包含一个 ’(’\texttt{'('} 和一个 ’)’\texttt{')'}。

输入输出样例

  • 输入#1

    2
    3
    
    0
    
    1
    
    1
    
    2
    
    3

    输出#1

    ? 4 1 2 3 3
    
    ? 2 2 1
    
    ? 2 3 1
    
    ! )((
    
    ? 4 1 2 1 2
    
    ! ()

说明/提示

在第一个测试用例中,隐藏的括号序列为 s=")(("s=\texttt{")(("}。

对于查询 “? 4 1 2 3 3”,评测器返回 00,因为 f(s1s2s3s3)=f(")(((")=0f(s_{1}s_{2}s_{3}s_{3}) = f(\texttt{")((("}) = 0。

对于查询 “? 2 2 1”,评测器返回 11,因为 f(s2s1)=f("()")=1f(s_{2}s_{1}) = f(\texttt{"()"}) = 1。

对于查询 “? 2 3 1”,评测器返回 11,因为 f(s3s1)=f("()")=1f(s_{3}s_{1}) = f(\texttt{"()"}) = 1。

在第二个测试用例中,隐藏的括号序列为 s="()"s=\texttt{"()"}。

对于查询 “? 4 1 2 1 2”,评测器返回 33,因为 f(s1s2s1s2)=f("()()")=3f(s_{1}s_{2}s_{1}s_{2}) = f(\texttt{"()()"}) = 3。

注意,样例仅用于帮助理解题意,并不保证一定能唯一确定括号序列 ss。

由 ChatGPT 4.1 翻译

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

首页