#CF2129C1. 交互式正则括号序列(简单版)
交互式正则括号序列(简单版)
C1. 交互式正则括号序列(简单版)
时间限制: 秒
内存限制: MB
这是一道交互题。
这是问题的简单版本,区别仅在于查询次数限制不同。只有解决了该问题的所有版本,你才能进行 hack。
有一个隐藏的长度为 的括号序列 ,其中 仅包含 '(' 和 ')'。保证 至少包含一个 '(' 和一个 ')'。
为了找出这个括号序列,你可以进行查询。每次查询的格式为:选择一个整数 以及任意的下标 (,)。注意下标可以重复。然后,你会收到陪审团计算出的一个整数 。
对于一个括号序列 , 表示 中非空的正则括号子串的数量(子串必须连续)。例如,。
括号序列称为正则的,当且仅当它可以通过以下方式构造:
- 空序列 是正则的。
- 若 是正则的,则 也是正则的。
- 若 和 都是正则的,则它们的拼接 也是正则的。
例如,序列 "(())()"、"()" 是正则的,而 "(()" 和 "())(" 不是。
请使用不超过 次查询找出序列 。
输入
每个测试包含多个测试用例。第一行包含测试用例数 ()。接下来是测试用例的描述。
交互
每个测试用例的第一行包含一个整数 ()。此时括号序列 已经选定。本题的交互器是非自适应的,即 在每个测试用例中固定,且在交互过程中不会改变。
要进行一次查询,你需要选择一个整数 和任意的下标 (,),并按以下格式输出一行(不含引号):
? k i1 i2 ... ik
然后你会收到一个整数 。
这种查询最多进行 次。
当你确定了括号序列 后,输出一行如下格式(不含引号):
! s1 s2 ... sn
注意这一行不算入查询次数。
此后继续处理下一个测试用例。
如果在一次交互中询问超过 次,你的程序必须立即终止,并会得到 Wrong Answer 判定。否则可能得到任意判定,因为你的程序将继续读取已关闭的流。
在输出查询或答案后,不要忘记输出换行并刷新输出。否则会得到 Idleness Limit Exceeded。在各语言中的做法:
- C++:
fflush(stdout)或cout.flush(); - Java:
System.out.flush(); - Pascal:
flush(output); - Python:
stdout.flush(); - 其他语言请参考对应文档。
Hack
进行 hack 时,请遵循以下测试格式。
第一行包含测试用例数 ()。接下来是测试用例的描述。
每个测试用例的第一行包含一个整数 ()。
第二行包含一个括号序列 ,其中 为 '(' 或 ')'。
括号序列 必须至少包含一个 '(' 和一个 ')'。
样例
输入
2
3
0
1
1
2
3
输出
? 4 1 2 3 3
? 2 2 1
? 2 3 1
! )((
? 4 1 2 1 2
! ()
说明
第一个测试用例中,隐藏的括号序列为 。
对于查询 ? 4 1 2 3 3,陪审团返回 ,因为 。
对于查询 ? 2 2 1,返回 ,因为 。
对于查询 ? 2 3 1,返回 ,因为 。
第二个测试用例中,隐藏序列为 。
对于查询 ? 4 1 2 1 2,返回 ,因为 。
注意样例仅用于说明题意,并不保证能唯一确定括号序列 。