#P9600. [IOI2023] 封锁时刻

[IOI2023] 封锁时刻

题目背景

这是一道交互题,你只需要实现代码中要求的函数。

你的代码不需要引用任何额外的头文件,也不需要实现 main 函数。

本题仅支持 C++ 语言提交。

题目描述

匈牙利有 NN 个城市,编号依次为 00N1N - 1

这些城市之间由 N1N - 1 条双向道路连接,编号为 00N2N - 2。对每个 jj0jN20 \le j \le N - 2),第 jj 条道路连接城市 U[j]U[j] 和城市 V[j]V[j],其长度为 W[j]W[j],表示这两个城市之间的交通时间为 W[j]W[j] 个时间单位。每条道路连接两个不同的城市,且每两个城市之间最多由一条道路连接。

两个不同城市 aabb 之间的一条路径是一个由不同城市组成的序列 p0,p1,,ptp_0, p_1, \ldots, p_t,满足以下条件:

  • p0=ap_0 = a
  • pt=bp_t = b
  • 对每个 ii0i<t0 \le i \lt t),存在一条道路连接 pip_ipi+1p_{i + 1}

利用这些道路从任意一个城市到任意一个其他的城市都是有可能的。换言之,任意两个不同城市之间都存在路径。
可以证明两个不同城市之间的路径是唯一的。

一条路径 p0,p1,,ptp_0, p_1, \ldots, p_t长度是这条路径上连接相邻城市的 tt 条道路的长度之和。

在匈牙利,很多人都会在建国日去参加在两个主要城市举行的庆祝活动。当庆祝活动结束时,他们会回家。政府为了防止人群干扰当地人,所以决定在特定时刻封锁城市。每个城市被政府分配一个非负的封锁时刻。政府决定所有城市的封锁时刻总和不得超过 KK。具体来说,对每个 ii0iN10 \leq i \leq N - 1),分配给城市 ii 的封锁时刻是一个非负整数 c[i]c[i]。所有 c[i]c[i] 之和不超过 KK

考虑一个城市 aa 和某个封锁时刻的分配方案,我们说城市 bb 是从城市 aa 可达的当且仅当以下两种情况中的任意一种情况成立。

情况 1:b=ab = a

情况 2:这两个城市之间的路径 p0,,ptp_0, \ldots, p_tp0=ap_0 = apt=bp_t = b)满足以下条件:

  • 路径 p0,p1p_0, p_1 的长度最多为 c[p1]c[p_1],并且
  • 路径 p0,p1,p2p_0, p_1, p_2 的长度最多为 c[p2]c[p_2],并且
  • \ldots
  • 路径 p0,p1,p2,,ptp_0, p_1, p_2, \ldots, p_t 的长度最长为 c[pt]c[p_t]

今年,两个主要的庆祝地点位于城市 XXYY
对于每一个封锁时刻的分配方案,可以定义一个便利分数,其定义为下面两个数字之和:

  • 从城市 XX 可达的城市个数。
  • 从城市 YY 可达的城市个数。

注意如果一个城市既能从城市 XX 可达也能从城市 YY 可达,那么它在计算便利分数时计算两次。

你的任务是计算能被某个封锁时刻分配方案实现的最大便利分数。

输入格式

CC 表示场景数,即调用 max_score 的次数。 评测程序实例按以下格式读取输入:

  • 11 行:CC

以下是 CC 个场景的描述。

评测程序实例按以下格式读取每个场景的描述:

  • 11 行:N  X  Y  KN \; X \; Y \; K
  • 2+j2 + j 行(0jN20 \le j \le N - 2):U[j]  V[j]  W[j]U[j] \; V[j] \; W[j]

输出格式

评测程序实例按以下格式为每个场景打印单独一行

  • 11 行: max_score 的返回值
2
7 0 2 10
0 1 2
0 3 3
1 2 4
2 4 2
2 5 5
5 6 3
4 0 3 20
0 1 18
1 2 1
2 3 19

6
3

提示

【实现细节】

你要实现以下函数。

int max_score(int N, int X, int Y, int64 K, int[] U, int[] V, int[] W)
  • NN:城市的个数
  • XXYY:两个主要庆祝城市
  • KK:封锁时刻总和的上界
  • UUVV: 长度为 N1N - 1 的描述道路连接情况的数组
  • WW:长度为 N1N - 1 的描述道路长度的数组
  • 该函数要返回能被某个封锁时刻分配方案实现的最大便利分数
  • 每个测试用例可以多次调用该函数

【例子】

考虑以下调用:

max_score(7, 0, 2, 10,
          [0, 0, 1, 2, 2, 5], [1, 3, 2, 4, 5, 6], [2, 3, 4, 2, 5, 3])

这对应以下道路网络:

假设封锁时刻如下分配:

城市 00 11 22 33 44 55 66
封锁时刻 00 44 00 33 22 00

注意所有封锁时刻之和为 99,不超过 K=10K = 10。城市 001133 都是从城市 XXX=0X = 0)可达的,而城市 112244 都可以从城市 YYY=2Y = 2)可达。 因此,便利分数为 3+3=63+3 = 6。不存在封锁时刻分配方案使得便利分数大于 66,所以该函数应该返回 66

考虑另外一个调用:

max_score(4, 0, 3, 20, [0, 1, 2], [1, 2, 3], [18, 1, 19])

这对应以下道路网络:

假设封锁时间如下分配:

城市 00 11 22 33
封锁时刻 00 11 1919 00

城市 00 从城市 XXX=0X = 0)可达,而城市 2233 都是可以从城市 YYY=3Y=3)可达的。因此,便利分数是 1+2=31 + 2 = 3。不存在封锁时刻分配方案使得便利分数大于 33,所以函数应该返回 33

【约束条件】

  • 2N2000002 \le N \le 200\,000
  • 0X<Y<N0 \le X \lt Y \lt N
  • 0K10180 \le K \le 10^{18}
  • 0U[j]<V[j]<N0 \le U[j] \lt V[j] \lt N (对每个 jj 满足 0jN20 \le j \le N - 2)
  • 1W[j]1061 \le W[j] \le 10^6 (对每个 jj 满足 0jN20 \le j \le N - 2)
  • 利用这些道路可以从任意一个城市走到任意另外一个城市。
  • SN200000S_N \le 200\,000,其中 SNS_N 是所有调用函数 max_scoreNN 的总和。

【子任务】

我们说一个道路网络是线性的如果道路 ii 连接城市 iii+1i+1(对每个0iN20 \le i \le N - 2ii)。

  1. (8 分)从城市 XX 到城市 YY 的路径长度大于 2K2K
  2. (9 分)SN50S_N \le 50,道路网络是线性的。
  3. (12 分)SN500S_N \le 500,道路网络是线性的。
  4. (14 分)SN3000S_N \le 3\,000,道路网络是线性的。
  5. (9 分)SN20S_N \le 20
  6. (11 分)SN100S_N \le 100
  7. (10 分)SN500S_N \le 500
  8. (10 分)SN3000S_N \le 3\,000
  9. (17 分)无额外的约束条件。