QOJ.ac

QOJ

حد الوقت: 5 s حد الذاكرة: 1024 MB مجموع النقاط: 100 تواصل

#17704. 赌场

الإحصائيات

Azzurro 和 Bordeaux 是一对在意大利赌场游玩的搭档,他们决定玩一个由荷官 Chiaro 提出的游戏。

在这个游戏中,信息通过一个 $N \times N$ 的网格($N = 8$)进行传输。网格的行从上到下编号为 $0$ 到 $N - 1$,列从左到右编号为 $0$ 到 $N - 1$。行号为 $r$、列号为 $c$ 的单元格记作 $(r, c)$。

在这个游戏中,Azzurro 和 Bordeaux 被隔离在不同的房间里。他们将进行 $Q$ 轮游戏。第 $i$ 轮($1 \le i \le Q$)的流程如下:

  1. Azzurro 从 Chiaro 那里收到一个整数 $N$,一个整数 $L_i$($1 \le L_i \le 51$),一张写有长度为 $L_i$、由 'A' 和 'B' 组成的字符串 $S_i$ 的卡片,以及一个所有单元格均为白色的 $N \times N$ 网格。
  2. Azzurro 将 $N^2$ 个单元格中的每一个都涂成蓝色或红色。然后他将网格交给 Chiaro。
  3. Chiaro 在 Azzurro 和 Bordeaux 都看不见的情况下执行以下操作: (a) 他通过重复仅向相邻的下方或右方单元格移动,选择一条从 $(0, 0)$ 到 $(N - 1, N - 1)$ 的路径。 (b) 对于路径上的每一个单元格,如果该单元格是蓝色的,他将其重涂为红色;如果它是红色的,他将其重涂为蓝色。
  4. Bordeaux 从 Chiaro 那里收到一张写有整数 $N$ 和 $L_i$ 的卡片,以及该网格。
  5. Bordeaux 在一张纸上写下一个长度为 $L_i$、由 'A' 和 'B' 组成的字符串。如果写下的字符串与 $S_i$ 匹配,则 Azzurro 和 Bordeaux 获胜。

请编写程序来实现 Azzurro 和 Bordeaux 的策略以赢得此游戏。关于此任务的评分,请参阅“评分”部分。

实现细节

你需要提交两个文件。

第一个文件是 Azzurro.cpp。它应该实现 Azzurro 的策略。它应该实现以下函数。程序应使用预处理指令 #include 包含 Azzurro.h

  • std::vector<std::vector<int>> Azzurro(int N, int L, std::string S) 该函数会被调用 $Q$ 次。第 $i$ 次调用($1 \le i \le Q$)对应游戏第 $i$ 轮的第 1、2 步。

    • 参数 $N$ 是第 $i$ 轮第 1 步中给 Azzurro 的卡片上写的整数 $N$。
    • 参数 $L$ 是第 $i$ 轮第 1 步中给 Azzurro 的卡片上写的整数 $L_i$。
    • 参数 $S$ 是第 $i$ 轮第 1 步中给 Azzurro 的卡片上写的字符串 $S_i$。

    对于每次对 Azzurro 函数的调用,你的程序必须返回一个 $N \times N$ 的二维数组 $x$,其每个元素均为 $0$ 或 $1$。如果不满足此条件,你的程序将被判定为 Wrong Answer [1]。

    • 如果 $x[r][c] = 0$($0 \le r \le N - 1, 0 \le c \le N - 1$),表示单元格 $(r, c)$ 被涂成蓝色。
    • 如果 $x[r][c] = 1$($0 \le r \le N - 1, 0 \le c \le N - 1$),表示单元格 $(r, c)$ 被涂成红色。

第二个文件是 Bordeaux.cpp。它应该实现 Bordeaux 的策略。它应该实现以下函数。程序应使用预处理指令 #include 包含 Bordeaux.h

  • std::string Bordeaux(int N, int L, std::vector<std::vector<int>> T) 该函数在 Azzurro 完成网格涂色后被调用。该函数总共会被调用 $Q$ 次。第 $i$ 次调用($1 \le i \le Q$)对应游戏第 $i$ 轮的第 4、5 步。
    • 参数 $N$ 是第 $i$ 轮第 4 步中给 Bordeaux 的卡片上写的整数 $N$。
    • 参数 $L$ 是第 $i$ 轮第 4 步中给 Bordeaux 的卡片上写的整数 $L_i$。
    • 参数 $T$ 是第 $i$ 轮第 4 步中给 Bordeaux 的网格对应的 $N \times N$ 二维数组。如果 $T[r][c] = 0$,则单元格 $(r, c)$($0 \le r \le N - 1, 0 \le c \le N - 1$)为蓝色;如果 $T[r][c] = 1$,则为红色。

对于每次对 Bordeaux 函数的调用,你的程序必须返回一个长度为 $L_i$、由 'A' 和 'B' 组成的字符串 $s$。如果不满足此条件,你的程序将被判定为 Wrong Answer [2]。

重要说明

  • 你的程序可以实现其他内部使用的函数,或使用全局变量。提交的文件将与评测程序一起编译,并成为一个单一的可执行文件。所有全局变量和内部函数都应在匿名命名空间中声明,以避免与其他文件冲突。在评测时,它将作为 Azzurro 和 Bordeaux 两个进程执行。Azzurro 进程和 Bordeaux 进程不能共享全局变量。
  • 你的程序不得使用标准输入和标准输出。你的程序不得通过任何方式与其他文件通信。但是,你的程序可以将调试信息输出到标准错误。

编译与测试运行

你可以从比赛网页下载包含示例评测程序的压缩包来测试你的程序。压缩包中还包含你程序的示例源文件。

示例评测程序文件名为 grader.cpp。为了测试你的程序,请将 grader.cppAzzurro.cppBordeaux.cppAzzurro.hBordeaux.h 放在同一目录下,并运行以下命令来编译你的程序:

g++ -std=gnu++20 -O2 -o grader grader.cpp Azzurro.cpp Bordeaux.cpp

或者,你可以运行压缩包中包含的 compile.sh。在这种情况下,运行以下命令来编译你的程序:

./compile.sh

编译成功后,将生成可执行文件 grader

请注意,实际的评测程序与示例评测程序不同。示例评测程序将作为一个单一进程执行,它会从标准输入读取数据并将结果写入标准输出。在实际的评测程序中,Chiaro 选择的路径是预先固定的。也就是说,Chiaro 选择的路径在调用你提交程序中的 AzzurroBordeaux 函数之前就已经确定了。

样例输入格式

示例评测程序从标准输入读取以下数据:

$Q \ N$ $L_1$ $S_1$ $R_1$ $L_2$ $S_2$ $R_2$ $\vdots$ $L_Q$ $S_Q$ $R_Q$

此处,$R_i$($1 \le i \le Q$)是一个长度为 $2(N - 1)$ 的字符串,恰好包含 $N - 1$ 个 'D' 和 $N - 1$ 个 'R'。该字符串表示 Chiaro 在第 $i$ 轮选择的路径,该路径从 $(0, 0)$ 开始,通过重复仅向相邻的下方或右方单元格移动,到达 $(N - 1, N - 1)$。具体来说,从 $(0, 0)$ 开始,对于每个 $j = 1, 2, \dots, 2(N - 1)$,如果 $R_i$ 的第 $j$ 个字符是 'D',则移动到下方相邻的单元格;如果是 'R',则移动到右方相邻的单元格。重复此过程最终会到达 $(N - 1, N - 1)$。

样例输出格式

示例评测程序将以下信息输出到标准输出(引号仅为清晰起见):

  • 如果你的程序被判定为正确,它会写入 $L^*$ 的值,格式为 “Accepted: 26”。关于 $L^*$ 的值,请参阅“评分”部分。
  • 如果你的程序被判定为任何类型的 Wrong Answer,示例评测程序会写入其类型,例如 “Wrong Answer [1]”。

如果你的程序满足多种 Wrong Answer 的条件,示例评测程序仅报告其中一种。当满足其中一个错误答案条件时,示例评测程序可能会终止执行。

数据范围

所有输入数据满足以下条件:

  • $1 \le Q \le 30\,000$。
  • $N = 8$。
  • $1 \le L_i \le 51$($1 \le i \le Q$)。
  • $Q, L_i$($1 \le i \le Q$)均为整数。
  • $S_i$($1 \le i \le Q$)是长度为 $L_i$、由 'A' 和 'B' 组成的字符串。
  • $R_i$($1 \le i \le Q$)是长度为 $2(N - 1)$、恰好包含 $N - 1$ 个 'D' 和 $N - 1$ 个 'R' 的字符串。

评分

如果你的程序在任何测试用例中被判定为任何类型的 Wrong Answer [1] 或 Wrong Answer [2](参见“实现细节”)、Time Limit Exceeded、Memory Limit Exceeded 或 Runtime Error,你的得分为 0 分。

否则,令 $L^*$ 为该任务所有测试用例中以下值的最小值。你的得分根据下表计算:

  • 满足 Azzurro 和 Bordeaux 在所有满足 $L_i \le L$ 的轮次中获胜的最大 $L$ 值。但是,如果他们在测试用例的所有轮次中都获胜,我们设 $L = 51$。
$L^*$ 的值 得分
$1 \le L^* \le 28$ $2L^*$ 分
$29 \le L^* \le 39$ $L^* + 28$ 分
$40 \le L^* \le 50$ $67 + 3(L^* - 40)$ 分
$L^* = 51$ $100$ 分

样例

样例输入 1 样例函数调用
函数调用 返回值
2 2 Azzurro(2, 1, "B")
1 [[1, 0], [0, 1]]
B Bordeaux(2, 1, [[0, 1], [0, 0]])
RD "B"
3 Azzurro(2, 3, "ABB")
ABB [[0, 0], [0, 0]]
DR Bordeaux(2, 3, [[1, 0], [1, 1]])
"ABB"

此样例输入包含 $Q (= 2)$ 轮,每轮使用一个 $N \times N$ 网格($N = 2$)。在此示例中,第一轮的流程如下:

  1. Azzurro 将 $(0, 1)$ 和 $(1, 0)$ 涂成蓝色,将 $(0, 0)$ 和 $(1, 1)$ 涂成红色。然后他将网格交给 Chiaro。
  2. Chiaro 在 Azzurro 和 Bordeaux 都看不见的情况下执行以下操作: (a) 他选择路径 $(0, 0) \to (0, 1) \to (1, 1)$ 作为从 $(0, 0)$ 到 $(N - 1, N - 1)$ 的路径。 (b) 对于路径上的三个单元格 $(0, 0), (0, 1), (1, 1)$,他改变它们的颜色。结果,$(0, 0), (0, 1), (1, 1)$ 的颜色分别变为蓝色、红色和蓝色。
  3. Bordeaux 可以通过在纸上写下 “B” 来赢得这一轮。

第二轮的流程如下:

  1. Azzurro 将所有单元格涂成蓝色。然后他将网格交给 Chiaro。
  2. Chiaro 在 Azzurro 和 Bordeaux 都看不见的情况下执行以下操作: (a) 他选择路径 $(0, 0) \to (1, 0) \to (1, 1)$ 作为从 $(0, 0)$ 到 $(N - 1, N - 1)$ 的路径。 (b) 对于路径上的三个单元格 $(0, 0), (1, 0), (1, 1)$,他改变它们的颜色。结果,$(0, 0), (1, 0), (1, 1)$ 的颜色全部变为红色。
  3. Bordeaux 可以通过在纸上写下 “ABB” 来赢得这一轮。

请注意,此样例输入不满足问题的约束条件。可以从比赛网站下载的文件 sample-01-in.txt 对应于样例输入 1。文件 sample-02-in.txt 是一个满足约束条件的样例输入。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download
#1371EditorialOpen题解Milmon2026-04-01 21:40:56View

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.