#HK5053. 「JOISC 2025 Day4」电路 2
「JOISC 2025 Day4」电路 2
题目描述
题目译自 JOISC 2025 Day4 T1 「電子回路 2 / Circuit 2」
JOI 君正在玩一套电子电路玩具。这套玩具包含 个 AND 元件、 个 OR 元件以及一个电路板。电路板上有 个开关和 个元件插槽,你可以将 AND 或 OR 部件插入插槽使用。电路板根据安装的元件和开关状态,以以下方式输出 或 的值。
- 开关编号从 到 ,每个开关有 ON 或 OFF 两种状态。每个开关按以下规则输出 或 。
- 元件插槽编号从 到 ,每个插槽按以下规则输出 或 。
- 各开关和元件插槽的输出按编号从大到小(相同编号时元件插槽优先)的顺序确定,规则如下:
- 对于 ,开关 输出:
- 若开关 为 OFF,则输出 。
- 若开关 为 ON,则输出 。
- 对于 ,设元件插槽 的输出为 ,则开关 输出:
- 若开关 为 OFF,则输出 。
- 若开关 为 ON,则输出 。
- 对于 ,元件插槽 与两个开关 连接,其中 。设开关 输出为 ,开关 输出为 ,则元件插槽 输出:
- 若安装的是 AND 元件,则输出 。
- 若安装的是 OR 元件,则输出 。
- 对于 ,恰好存在一个 使得 或 。
- 电路板的输出与开关 的输出相同。
- 对于 ,开关 输出:
例如,若 ,$U_{0}=1, V_{0}=2, U_{1}=3, V_{1}=4, U_{2}=5, V_{2}=6$,且元件插槽 分别安装了 AND 元件、AND 元件和 OR 元件,则电路板如下图所示:

JOI 君原本打算在所有元件插槽上安装 AND 元件,但发现安装的元件中混入了最多 个 OR 元件。由于 AND 元件和 OR 元件外观无法区分,必须通过电路板测试来分辨。你需要通过向 JOI 君提出最多 个以下形式的询问,确定哪些插槽安装了 OR 元件:
- 你可以指示 JOI 君如何设置 个开关的状态。JOI 君会按照指示调整开关状态,并告诉你电路板的输出值。
给定电路板的连接信息和安装 OR 元件的上限数量,你需要编写一个程序,通过不超过 次询问,确定哪些元件插槽安装了 OR 元件。
输入格式
你需要提交一个文件,文件名为 circuit.cpp。需通过 #include 引入 circuit.h,并实现以下函数:
std::string solve(int N, int R, std::vector<int> U, std::vector<int> V)- 此函数在每个测试点中仅调用一次。
- 参数
N是元件插槽数量 。 - 参数
R是安装 OR 元件的个数上限 。 - 参数
U, V是长度为 的数组,对于 ,U[i], V[i]表示元件插槽 连接的开关编号 。 - 此函数必须返回一个长度为 的字符串
t,由字符&和|组成,满足:- 对于每个 ,若元件插槽 安装的是 AND 元件,则
t[i]为&;若为 OR 元件,则t[i]为|。
- 对于每个 ,若元件插槽 安装的是 AND 元件,则
- 若返回的
t长度不等于 ,将被判为Wrong Answer [1]。 - 若返回的
t包含非&或|的字符,将被判为Wrong Answer [2]。 - 若返回的
t与实际安装元件种类不符,将被判为Wrong Answer [3]。
你的程序可以调用以下函数:
int query(std::string s)- 此函数用于向 JOI 君提出询问。
- 参数
s是一个长度为 的字符串,由字符0和1组成。对于 ,若s[j]为0,表示将开关 设置为 OFF;若为1,表示设置为 ON。 - 若参数
s的长度不等于 ,将被判为Wrong Answer [4]。 - 若参数
s包含非0或1的字符,将被判为Wrong Answer [5]。 - 此函数调用次数不得超过 次,否则将被判为
Wrong Answer [6]。 - 函数返回值是在参数
s设置下的电路板输出值。
注意事项
- 你可以自由实现其他内部函数或声明全局变量。
- 你的程序不得以任何方式与标准输入、标准输出或其他文件进行交互,但允许向标准错误输出调试信息。
实际评测程序非自适应,答案固定。
编译与运行
「文件」界面提供示例评测程序压缩包。该压缩包也包含需提交的文件样例。
示例评测程序由一个文件组成,文件名为 grader.cpp。要测试你的程序,请将 grader.cpp, circuit.cpp, circuit.h 放入同一目录,并执行以下命令:
g++ -std=gnu++20 -O2 -o grader grader.cpp circuit.cpp
或者,你可以使用压缩包中包含的 compile.sh 文件,执行以下命令:
./compile.sh
编译成功后,将生成名为 grader 的可执行文件。
注意,实际评分程序与样例评分程序可能不同。示例评测程序作为单一进程启动,从标准输入读取输入,并将结果输出到标准输出。
输入格式
设 为函数 solve 应返回的长度为 的字符串。示例评测程序从标准输入读取以下格式的数据:
- 第一行包含两个整数 ,用空格分隔,分别表示元件插槽数量 和 OR 元件个数上限 。
- 接下来 行,第 行包含两个整数 ,用空格分隔,表示元件插槽 连接的开关编号。
- 最后一行包含一个字符串 ,表示实际安装的元件种类。
输出格式
示例评测程序向标准输出输出以下信息:
- 若正确,输出类似
Accepted: 22,其中数字为函数query的调用次数。 - 若不正确,输出类似
Wrong Answer [4],表示不正确答案的类型编号。
示例评测程序在检测到任何不正确条件时会终止执行。若程序符合多个不正确条件,仅显示其中一种。
1 1
1 2
|
在第 次 query 调用中,电路板的输出计算如下:
- 开关 的状态分别为 ON, OFF,因此开关 分别输出 。
- 元件插槽 安装了 OR 元件,连接的开关 分别输出 ,因此元件插槽 输出 。
- 开关 的状态为 OFF,元件插槽 输出为 ,因此开关 输出 。
- 因此,电路板输出为 。
此样例满足所有子任务的限制。
3 3
1 2
3 4
5 6
&&|
此样例对应问题中的图。
这个样例满足子任务 的限制。
数据范围与提示
对于所有输入数据,满足:
- 每个 恰被一个 或 使用
详细子任务附加限制及分值如下表所示。
| 子任务 | 分值 | 附加限制 |
|---|---|---|
| 无附加限制 |