#P14345. [JOISC 2019] 两种交通 / Two Transportations
[JOISC 2019] 两种交通 / Two Transportations
题目背景
请使用 C++ 20 提交。不要引入头文件,并在文件头粘贴如下内容:
#include <vector>
void InitA(int, int, std::vector<int>, std::vector<int>, std::vector<int>);
void ReceiveA(bool);
std::vector<int> Answer();
void SendA(bool);
void InitB(int, int, std::vector<int>, std::vector<int>, std::vector<int>);
void ReceiveB(bool);
void SendB(bool);
题目描述
JOI 国有 座城市,编号从 到 。有 条铁路线,编号从 到 。铁路线 ()双向连接城市 与城市 ,票价为 。不同的铁路线连接不同的城市对。另有 条公交线路,编号从 到 。公交线路 ()双向连接城市 与城市 ,票价为 。不同的公交线路连接不同的城市对,但一条铁路线与一条公交线路可能连接相同的城市对。通过铁路和/或公交,可以在任意两座城市之间通行。
Azer 想知道从城市 到每个城市的最小总票价。由于 Azer 仅了解铁路线的信息,他与仅了解公交线路信息的 Baijan 合作。
他们通过发送和接收字符 0 或 1 进行通信。发送的字符总数应小于或等于 58000。
编写程序,Azer 的程序接收铁路线信息,Baijan 的程序接收公交线路信息,二者通过通信协作,帮助 Azer 找到从城市 到每个城市的最小总票价。
实现细节
你需要实现两个文件。
第一个文件的名称为 Azer.cpp。它表示 Azer 的行为,应实现以下函数。该文件应包含 Azer.h。
void InitA(int N, int A, std::vector<int> U, std::vector<int> V, std::vector<int> C)
此函数在程序开始时恰好执行一次。- 参数 是城市数量 。
- 参数 是铁路线数量 。
- 参数 、 是长度为 的数组。 和 是由铁路线 ()连接的两座城市。
- 参数 是长度为 的数组。 是铁路线 ()的票价 。
void ReceiveA(bool x)
此函数在 Baijan 每发送一个字符时执行一次。- 参数 表示 Baijan 发送的字符:
true代表字符 1,false代表字符 0。
- 参数 表示 Baijan 发送的字符:
std::vector<int> Answer()
此函数在所有发送的字符均被接收后恰好执行一次。该函数必须返回一个数组 ,其中包含从城市 到每个城市的最小总票价。- 返回值 必须是一个长度为 的数组。若其长度不为 ,你的程序将被判定为 Wrong Answer [1]。
- ()必须是从城市 到城市 所需的最小总票价。特别地,需满足 。
你的程序可在本文件中调用以下函数:
void SendA(bool y)
使用此函数向 Baijan 发送一个字符。- 参数 表示要发送给 Baijan 的字符:
true代表字符 1,false代表字符 0。
- 参数 表示要发送给 Baijan 的字符:
第二个文件的名称为 Baijan.cpp。它表示 Baijan 的行为,应实现以下函数。该文件应包含 Baijan.h。
void InitB(int N, int B, std::vector<int> S, std::vector<int> T, std::vector<int> D)
此函数在程序开始时恰好执行一次。- 参数 是城市数量 。
- 参数 是公交线路数量 。
- 参数 、 是长度为 的数组。 和 是由公交线路 ()连接的两座城市 与 。
- 参数 是长度为 的数组。 是公交线路 ()的票价 。
void ReceiveB(bool y)
此函数在 Azer 每发送一个字符时执行一次。- 参数 表示 Azer 发送的字符:
true代表字符 1,false代表字符 0。
- 参数 表示 Azer 发送的字符:
你的程序可在本文件中调用以下函数:
void SendB(bool x)
使用此函数向 Azer 发送一个字符。- 参数 表示要发送给 Azer 的字符:
true代表字符 1,false代表字符 0。
- 参数 表示要发送给 Azer 的字符:
你可以假设程序按如下方式执行。对于每个测试用例,准备两个队列:,用于存储 Azer 发送的字符;以及 ,用于存储 Baijan 发送的字符。首先,执行 InitA 和 InitB,并将发送的字符推入对应的队列。
- 若 或 非空,则从其中一个队列中弹出一个字符,并执行对应的
ReceiveA或ReceiveB。然而,若 与 均非空,则无法确定执行ReceiveA还是ReceiveB。 - 当在
ReceiveA执行期间调用SendA时,所发送的字符将被推入 。 - 当在
ReceiveB执行期间调用SendB时,所发送的字符将被推入 。 - 若两个队列均为空,则执行
Answer,程序结束。
Azer 与 Baijan 发送的字符总数应小于或等于 58000。若超过该限制,你的程序将被判定为 Wrong Answer [2]。
重要提示
- 你的程序可为内部用途实现其他函数,或使用全局变量。提交的文件将与评测程序一起编译,生成一个可执行文件。所有全局变量与内部函数应声明于一个未命名命名空间中,以避免与其他文件冲突。在评测时,程序将作为 Azer 与 Baijan 两个独立进程运行。Azer 进程与 Baijan 进程不能共享全局变量。
- 你的程序不应使用标准输入与标准输出。你的程序不应以任何方式与其他文件通信。然而,你的程序可向标准错误输出调试信息。
输入格式
示例评测程序从标准输入读取如下格式的数据:
输出格式
示例评测程序将以下信息写入标准输出和标准错误(为清晰起见,此处使用引号):
-
若你的程序被判定为 Wrong Answer [1] 或 Wrong Answer [2],它会将类型写作 “Wrong Answer [1]” 输出至标准错误,且不会向标准输出写入任何内容。
-
否则,它会将发送字符的总数 以 “Accepted: L” 的形式写入标准错误。同时,它会按以下格式将你的答案 写入标准输出:
示例评测程序不会检查 的值是否正确。
若你的程序被判定为多种类型的 Wrong Answer,示例评测程序仅报告其中一种。
4 3 4
0 1 6
2 1 4
2 0 10
1 2 3
3 1 1
3 2 3
3 0 7
提示
数据范围
- 。
- 。
- 。
- ()。
- ()。
- ()。
- 且 ()。
- ()。
- ()。
- ()。
- 且 ()。
- 任意两座城市之间均可通过铁路和/或公交线路到达。
- ()。
- ()。
子任务
- (6 分)。
- (8 分)。
- (8 分)。
- (38 分)。
- (14 分)。
- (10 分)。
- (16 分)无额外约束。
翻译由 Qwen3-235B 完成