#HK5053. 「JOISC 2025 Day4」电路 2

「JOISC 2025 Day4」电路 2

题目描述

题目译自 JOISC 2025 Day4 T1 「電子回路 2 / Circuit 2

JOI 君正在玩一套电子电路玩具。这套玩具包含 NN 个 AND 元件、NN 个 OR 元件以及一个电路板。电路板上有 2N+12N+1 个开关和 NN 个元件插槽,你可以将 AND 或 OR 部件插入插槽使用。电路板根据安装的元件和开关状态,以以下方式输出 0011 的值。

  • 开关编号从 002N2N,每个开关有 ON 或 OFF 两种状态。每个开关按以下规则输出 0011
  • 元件插槽编号从 00N1N-1,每个插槽按以下规则输出 0011
  • 各开关和元件插槽的输出按编号从大到小(相同编号时元件插槽优先)的顺序确定,规则如下:
    • 对于 j=2N,2N1,,Nj=2N, 2N-1, \ldots, N,开关 jj 输出:
      • 若开关 jj 为 OFF,则输出 00
      • 若开关 jj 为 ON,则输出 11
    • 对于 j=N1,N2,,0j=N-1, N-2, \ldots, 0,设元件插槽 jj 的输出为 xx,则开关 jj 输出:
      • 若开关 jj 为 OFF,则输出 xx
      • 若开关 jj 为 ON,则输出 1x1-x
    • 对于 i=N1,N2,,0i=N-1, N-2, \ldots, 0,元件插槽 ii 与两个开关 Ui,ViU_{i}, V_{i} 连接,其中 i<Ui<Vi2Ni < U_{i} < V_{i} \leq 2N。设开关 UiU_{i} 输出为 xx,开关 ViV_{i} 输出为 yy,则元件插槽 ii 输出:
      • 若安装的是 AND 元件,则输出 min(x,y)\min(x, y)
      • 若安装的是 OR 元件,则输出 max(x,y)\max(x, y)
    • 对于 j=1,2,,2Nj=1, 2, \ldots, 2N,恰好存在一个 ii (0iN1)(0 \leq i \leq N-1) 使得 Ui=jU_{i}=jVi=jV_{i}=j
    • 电路板的输出与开关 00 的输出相同。

例如,若 N=3N=3,$U_{0}=1, V_{0}=2, U_{1}=3, V_{1}=4, U_{2}=5, V_{2}=6$,且元件插槽 0,1,20, 1, 2 分别安装了 AND 元件、AND 元件和 OR 元件,则电路板如下图所示:

JOI 君原本打算在所有元件插槽上安装 AND 元件,但发现安装的元件中混入了最多 RR 个 OR 元件。由于 AND 元件和 OR 元件外观无法区分,必须通过电路板测试来分辨。你需要通过向 JOI 君提出最多 10001000 个以下形式的询问,确定哪些插槽安装了 OR 元件:

  • 你可以指示 JOI 君如何设置 2N+12N+1 个开关的状态。JOI 君会按照指示调整开关状态,并告诉你电路板的输出值。

给定电路板的连接信息和安装 OR 元件的上限数量,你需要编写一个程序,通过不超过 10001000 次询问,确定哪些元件插槽安装了 OR 元件。

输入格式

你需要提交一个文件,文件名为 circuit.cpp。需通过 #include 引入 circuit.h,并实现以下函数:

  • std::string solve(int N, int R, std::vector<int> U, std::vector<int> V)
    • 此函数在每个测试点中仅调用一次。
    • 参数 N 是元件插槽数量 NN
    • 参数 R 是安装 OR 元件的个数上限 RR
    • 参数 U, V 是长度为 NN 的数组,对于 0iN10 \leq i \leq N-1U[i], V[i] 表示元件插槽 ii 连接的开关编号 Ui,ViU_{i}, V_{i}
    • 此函数必须返回一个长度为 NN 的字符串 t,由字符 &| 组成,满足:
      • 对于每个 i=0,1,,N1i=0, 1, \ldots, N-1,若元件插槽 ii 安装的是 AND 元件,则 t[i]&;若为 OR 元件,则 t[i]|
    • 若返回的 t 长度不等于 NN,将被判为 Wrong Answer [1]
    • 若返回的 t 包含非 &| 的字符,将被判为 Wrong Answer [2]
    • 若返回的 t 与实际安装元件种类不符,将被判为 Wrong Answer [3]

你的程序可以调用以下函数:

  • int query(std::string s)
    • 此函数用于向 JOI 君提出询问。
    • 参数 s 是一个长度为 2N+12N+1 的字符串,由字符 01 组成。对于 j=0,1,,2Nj=0, 1, \ldots, 2N,若 s[j]0,表示将开关 jj 设置为 OFF;若为 1,表示设置为 ON。
    • 若参数 s 的长度不等于 2N+12N+1,将被判为 Wrong Answer [4]
    • 若参数 s 包含非 01 的字符,将被判为 Wrong Answer [5]
    • 此函数调用次数不得超过 10001000 次,否则将被判为 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 的可执行文件。

注意,实际评分程序与样例评分程序可能不同。示例评测程序作为单一进程启动,从标准输入读取输入,并将结果输出到标准输出。

输入格式

TT 为函数 solve 应返回的长度为 NN 的字符串。示例评测程序从标准输入读取以下格式的数据:

  • 第一行包含两个整数 N,RN, R,用空格分隔,分别表示元件插槽数量 NN 和 OR 元件个数上限 RR
  • 接下来 NN 行,第 ii (0iN1)(0 \leq i \leq N-1) 行包含两个整数 Ui,ViU_{i}, V_{i},用空格分隔,表示元件插槽 ii 连接的开关编号。
  • 最后一行包含一个字符串 TT,表示实际安装的元件种类。

输出格式

示例评测程序向标准输出输出以下信息:

  • 若正确,输出类似 Accepted: 22,其中数字为函数 query 的调用次数。
  • 若不正确,输出类似 Wrong Answer [4],表示不正确答案的类型编号。

示例评测程序在检测到任何不正确条件时会终止执行。若程序符合多个不正确条件,仅显示其中一种。

1 1
1 2
|

在第 11query 调用中,电路板的输出计算如下:

  • 开关 1,21, 2 的状态分别为 ON, OFF,因此开关 1,21, 2 分别输出 1,01, 0
  • 元件插槽 00 安装了 OR 元件,连接的开关 1,21, 2 分别输出 1,01, 0,因此元件插槽 00 输出 max(1,0)=1\max(1, 0)=1
  • 开关 00 的状态为 OFF,元件插槽 00 输出为 11,因此开关 00 输出 11
  • 因此,电路板输出为 11

此样例满足所有子任务的限制。

3 3
1 2
3 4
5 6
&&|

此样例对应问题中的图。

这个样例满足子任务 3,6,7,8,93,6,7,8,9 的限制。

数据范围与提示

对于所有输入数据,满足:

  • 1N80001 \leq N \leq 8000
  • 1Rmin(N,120)1 \leq R \leq \min(N, 120)
  • i<Ui<Vi2Ni < U_i < V_i \leq 2N (0iN1)(0 \leq i \leq N-1)
  • 每个 j=1,2,,2Nj = 1, 2, \ldots, 2N 恰被一个 UiU_iViV_i 使用

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 11 N=1N = 1
22 44 N1000,R=1N \leq 1000, R = 1
33 55 N1000N \leq 1000
44 1717 Ui=i+1,Vi=N+1+iU_i = i+1, V_i = N+1+i (0iN1),R70(0 \leq i \leq N-1), R \leq 70
55 88 Ui=i+1,Vi=N+1+iU_i = i+1, V_i = N+1+i (0iN1)(0 \leq i \leq N-1)
66 2323 Ui=2i+1,Vi=2i+2U_i = 2i+1, V_i = 2i+2 (0iN1),R70(0 \leq i \leq N-1), R \leq 70
77 88 Ui=2i+1,Vi=2i+2(0iN1)U_i = 2i+1, V_i = 2i+2 \, (0 \leq i \leq N-1)
88 2727 R70R \leq 70
99 77 无附加限制