#P14952. [2026年重庆省队集训]Coreputer
[2026年重庆省队集训]Coreputer
题目描述
这是一道交互题。
有一个长为 的序列 ,其中每个 都是 或 。保证序列中存在至少一个 。
你不知道这个序列。为了确定这个序列的具体值,你可以进行下面这种测试:
- 选择一个下标集合 的子集 ,没选中的元素集合 。你可以知道 和 哪一个包含的 数量更多,或者两个集合的 数量相等。
实现细节
你需要实现以下过程:
std::vector<int> solve(int n)
- 是序列长度。
- 这个过程需要返回一个数组 ,表示你确定的序列。
- 这个过程在每组测试点会被调用至多 次。
上述过程可以调用以下过程:
int query(std::vector<int> V)
- 表示你测试的下标集合 。 包含 个元素,依次对应 中的元素。
- 这个过程返回:
- :如果 包含的 比 多;
- :如果 包含的 与 相等;
- :如果 包含的 比 少;
- 在每组测试数据中,这个过程最多能被调用 次。
交互库不自适应。
样例
样例输入 1
1
4
0 0 1 0
样例输出 1
0 0 1 0
3
说明
solve 可能会按如下方式调用 query:
query([0])返回 ,因为这个集合存在 个 ,不在这个集合的有 个 。query([1, 2])返回 。query([2])返回 。
通过以上询问的结果,可以唯一确定这个序列是 。
数据范围
。
子任务
- (20 分)
- (20 分)
- (40 分) 序列中 的数量是奇数。
- (20 分) 没有附加限制。
如果任何测试数据中对 solve 的调用不符合“实现细节”中描述的约束,或者 solve 的返回值不正确,则该测试点的得分将为 。
在每个子任务中,你可以获得部分分数。设 为一次调用 solve 时,你调用 query 次数的最大值,你可以获得该子任务得分的相应百分比:
你在一组子任务的得分是所有测试点得分的最小值,最终将会被下取整。
样例评测程序
样例评测程序按以下格式读取输入:
第 1 行:,表示调用 solve 的次数。
接下来 次输入,每次输入两行:
第 1 行:
第 2 行:
在调用 solve 之前,样例评测程序会检查是否至少有一个 。如果不满足此条件,它将打印消息 No 1 in the sequence 并终止整个程序。
如果你调用 query 时:
- 数组 包含大于 个元素,或
- 存在元素不是 到 之间的整数,或
- 包含重复元素
输出将为 Protocol Violation: invalid array。
如果你调用 query 的次数超过 次,输出将为 Protocol Violation: too many calls。
否则,设你的 solve 返回的数组元素是 ,对于这次调用,样例评测程序按以下格式输出:
第 1 行:。
第 2 行:调用 query 的次数。