QOJ.ac

QOJ

Límite de tiempo: 2.0 s Límite de memoria: 1024 MB Puntuación total: 100 Comunicación

#17267. Helpful Bits

Estadísticas

想象一下,你需要求一个带权无向图中若干对顶点之间的最短路径长度。

听起来太简单了,不是吗?我们也这么觉得。

因此,在本题中,你的程序在每个测试点上将被运行两次。在第一次运行期间,你可以读取边权。在第二次运行期间,你将只获得没有边权的图,并且你需要求出若干对顶点之间的最短路径长度。

“没有边权我怎么知道最短路径?”你可能会问。这是一个非常合理的问题,所以我们会让它变得简单一些:

  • 如果在第一次运行期间给你 $m$ 个边权,你最多可以输出 $12m$ 个比特(作为一个二进制字符串),它们将被原封不动地传递给你程序的第二次运行。
  • 最短路径长度不需要精确,但与实际值 $X$ 的误差不能超过其 $0.1\%$。换句话说,你的答案 $Y$ 必须满足条件 $0.999X \le Y \le 1.001X$。

输入格式

你的程序在每个测试点上将被运行两次。

第一行包含一个整数 $T$ ($1 \le |T| \le 10^5$)。其绝对值表示测试用例的数量。如果 $T < 0$,则是第一次运行;否则,是第二次运行。接着是 $|T|$ 个测试用例,格式如下。

如果是第一次运行:

下一行包含一个整数 $m$ ($1 \le m \le 10^5$),表示图中的边数。

下一行包含 $m$ 个整数 $w_1, w_2, \dots, w_m$ ($1 \le w_i \le 10^6$),表示边的权重。

如果是第二次运行:

下一行包含四个整数 $n, m, q, b$ ($2 \le n \le 10^5$, $1 \le m \le 10^5$, $1 \le q \le 10^5$, $0 \le b \le 12m$),分别表示顶点数、图中的边数、最短路径长度查询的数量,以及你在第一次运行期间发送的比特数。

下一行包含一个长度为 $b$ 的二进制字符串:即你在第一次运行期间打印的比特。

接下来的 $m$ 行中,第 $i$ 行包含两个整数 $a_i, b_i$ ($1 \le a_i, b_i \le n, a_i \ne b_i$):表示下一条边的端点。该边的权重等于第一次运行中的 $w_i$(但在第二次运行中不会给出)。

接下来的 $q$ 行中,每行包含两个整数 $s, f$ ($1 \le s, f \le n$),表示要求你求出从顶点 $s$ 到顶点 $f$ 的最短路径长度。

保证两次运行中给出的 $m$ 值相同,没有任意一对顶点被直接连接超过一次,且在单个文件中所有测试用例的 $n$ 之和以及 $m \cdot q$ 之和均不超过 $3 \cdot 10^5$。

输出格式

对于每个测试用例:

如果是第一次运行:

输出一个整数 $b$ ($0 \le b \le 12m$):你打算传递给第二次运行的比特数。

如果 $b > 0$,在下一行输出一个长度为 $b$ 的二进制字符串:即比特本身。它们将被原封不动地传递给第二次运行。

如果是第二次运行:

对于 $q$ 个查询中的每一个,输出两个请求顶点之间的最短路径长度,如果不存在这样的路径,则输出 $-1$。你的答案不需要是整数,可以是小数,小数点后最多保留 15 位数字。如果你的答案与正确答案 $X$ 的绝对误差不超过 $X \cdot 10^{-3}$,则将被接受。

样例

输入样例 1

-2
3
4 5 6
1
1

输出样例 1

36
000000000100000000000101000000000110
12
000000000001

输入样例 2

2
4 3 5 36
000000000100000000000101000000000110
1 2
2 3
3 1
1 1
1 2
3 1
2 3
2 4
2 1 1 12
000000000001
1 2
1 2

输出样例 2

0.00000
4.00000
6.00000
5.00000
-1.00000
1.00000

说明

在原样例中,程序的两次运行输入和输出数据是用虚线和额外的空行隔开的。实际的输入和输出数据中既没有虚线也没有空行。

对于样例中的两个测试用例,在第一次运行期间,解决方案决定使用所有可用的比特,并将所有权重写为 12 位二进制数。然后,在第二次运行期间,解决方案计算出了所有边的权重,并打印了所有请求的最短路径长度,包括顶点 2 和 4 之间不存在路径的情况。

请注意,当你在测试系统中查看样例时,输入数据可能不完全对应于任何一次运行的实际输入数据,因为这些数据是根据测试的内部格式生成的。

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.