QOJ.ac

QOJ

実行時間制限: 4.5 s メモリ制限: 4096 MB 満点: 100

#13544. 卡车司机

統計

匈牙利是一个拥有 $N$ 个城市的国家,城市编号从 $0$ 到 $N - 1$。

这些城市由 $N - 1$ 条双向道路连接,道路编号从 $0$ 到 $N - 2$。道路 $j$ ($0 \le j \le N - 2$) 连接城市 $U[j]$ 和城市 $V[j]$,长度为 $T[j]$,也就是说,在两城市之间通行需要花费 $T[j]$ 个单位的时间。每条道路连接两个不同的城市,且任意两个城市之间最多只有一条道路连接。

两个不同城市 $a$ 和 $b$ 之间的路径是指一个由互不相同的城市组成的序列 $p_0, p_1, \dots, p_l$,满足:

  • $p_0 = a$,
  • $p_l = b$,
  • 对于每个 $i$ ($0 \le i < l$),都有一条道路连接城市 $p_i$ 和 $p_{i+1}$。

可以通过这些道路从任意城市前往其他任意城市,也就是说,任意两个不同的城市之间都存在一条路径。请注意,连接任意一对城市的路径是唯一的。

城市 $a$ 和 $b$ 之间的距离记为 $d(a, b)$,定义如下:

  • 如果 $a = b$,则 $d(a, b) = 0$,
  • 否则,$d(a, b)$ 为连接 $a$ 和 $b$ 之间路径上相邻城市的道路总长度。

Karcsi 是一名卡车司机,他需要在各个城市完成一定数量的货物送达任务。对于每个 $i$ ($0 \le i \le N - 1$),Karcsi 需要在城市 $i$ 完成 $W[i]$ 次送达。Karcsi 从城市 $0$ 出发,他可以按任意顺序完成送达,最后返回城市 $0$。一个送达方案是一个(可能为空的)城市序列 $c_1, c_2, \dots, c_m$,满足对于每个 $i$ ($0 \le i < N$),该序列中恰好包含城市 $i$ 共 $W[i]$ 次。

一个方案 $c_1, c_2, \dots, c_m$ 的送达时间是序列 $0, c_1, c_2, \dots, c_m, 0$ 中相邻城市之间距离的总和,即 $d(0, c_1) + d(c_1, c_2) + \dots + d(c_m, 0)$。

Karcsi 需要工作 $Q$ 天。在每天开始时,其中一个城市所需的送达次数会发生变化。对于某个城市 $S$ 和非负整数 $X$,$W[S]$ 的值变为 $X$。只要在之后的某天开始时没有被再次修改,$W[S]$ 的值就保持为 $X$。

Karcsi 按小时计薪。他希望选择一个送达方案,使得送达时间在所有可能的方案中达到最大。你的任务是计算 Karcsi 工作的每一天所能达到的最大送达时间。

实现细节

你需要实现以下两个函数:

void init(int N, int[] U, int[] V, int[] T, int[] W)
  • N:城市的数量。
  • U, V:长度为 $N - 1$ 的数组,描述道路连接情况。
  • T:长度为 $N - 1$ 的数组,描述道路长度。
  • W:长度为 $N$ 的数组,描述每个城市的初始送达次数。
  • 对于每个测试用例,该函数在调用 max_time 之前恰好被调用一次。
int64 max_time(int S, int X)
  • S, X:描述送达次数变化的整数。$W[S]$ 的值应被设置为 $X$。
  • 该函数应首先执行指定的更新,然后返回所有可能送达方案中的最大送达时间。
  • 该函数恰好被调用 $Q$ 次。

样例

考虑以下调用序列:

init(5, [0, 0, 1, 1], [1, 2, 3, 4], [1, 2, 3, 1], [0, 0, 1, 0, 1])

这些参数对应于下图所示的道路网络。红色数字表示每个城市的初始送达次数。

max_time(0, 1)

更新后,我们有 $W = [1, 0, 1, 0, 1]$。一个可能的送达方案是序列 $4, 2, 0$。在这种情况下,Karcsi 依次访问城市 $0, 4, 2, 0, 0$,送达时间为 $d(0, 4) + d(4, 2) + d(2, 0) + d(0, 0) = 2 + 4 + 2 + 0 = 8$。

不存在送达时间大于 8 的送达方案,因此该函数应返回 8。

下表总结了对 max_time 的更多调用示例:

调用 更新后的 $W$ 最优方案 最大送达时间
max_time(3, 3) [1, 0, 1, 3, 1] 3, 0, 3, 2, 3, 4 $4 + 4 + 4 + 6 + 6 + 4 + 2 = 30$
max_time(0, 0) [0, 0, 1, 3, 1] 3, 2, 3, 4, 3 $4 + 6 + 6 + 4 + 4 + 4 = 28$
max_time(4, 0) [0, 0, 1, 3, 0] 3, 2, 3, 3 $4 + 6 + 6 + 0 + 4 = 20$
max_time(2, 0) [0, 0, 0, 3, 0] 3, 3, 3 $4 + 0 + 0 + 4 = 8$
max_time(3, 0) [0, 0, 0, 0, 0] $0$

数据范围

  • $2 \le N \le 100\,000$
  • 对于满足 $0 \le j \le N - 2$ 的每个 $j$,有 $0 \le U[j] < V[j] < N$
  • 对于满足 $0 \le j \le N - 2$ 的每个 $j$,有 $1 \le T[j] \le 100$
  • 可以通过这些道路从任意城市前往其他任意城市。
  • 对于满足 $0 \le i < N$ 的每个 $i$,有 $0 \le W[i] \le 10^6$
  • $1 \le Q \le 300\,000$
  • $0 \le S < N$
  • $0 \le X \le 10^6$

子任务

  1. (8 分)$N = 2$
  2. (21 分)$N, Q \le 1\,000$
  3. (14 分)对于满足 $0 \le j \le N - 2$ 的每个 $j$,有 $U[j] = \lfloor \frac{j}{2} \rfloor$ 且 $V[j] = j + 1$
  4. (21 分)对于满足 $0 \le j \le N - 2$ 的每个 $j$,有 $U[j] = j$ 且 $V[j] = j + 1$
  5. (36 分)无附加限制。

评测程序示例

评测程序示例按以下格式读取输入:

  • 第 1 行:$N$ $Q$
  • 第 2 行:$U[0]$ $U[1]$ $\dots$ $U[N - 2]$
  • 第 3 行:$V[0]$ $V[1]$ $\dots$ $V[N - 2]$
  • 第 4 行:$T[0]$ $T[1]$ $\dots$ $T[N - 2]$
  • 第 5 行:$W[0]$ $W[1]$ $\dots$ $W[N - 1]$
  • 第 $6 + k$ 行($0 \le k < Q$):第 $k$ 次更新的 $S$ $X$

评测程序示例按以下格式输出你的答案:

  • 第 $1 + k$ 行($0 \le k < Q$):更新 $k$ 后 max_time 的返回值

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.