#L3988. 「IOI2023」封锁时刻
「IOI2023」封锁时刻
题目描述
匈牙利有 个城市,编号依次为 到 。
这些城市之间由 条双向道路连接,编号为 至 。对每个 (),第 条道路连接城市 和城市 ,其长度为 ,表示这两个城市之间的交通时间为 个时间单位。每条道路连接两个不同的城市,且每两个城市之间最多由一条道路连接。
两个不同城市 和 之间的一条路径是一个由不同城市组成的序列 ,满足以下条件:
- ,;
- 对每个 (),存在一条道路连接 和 。
利用这些道路从任意一个城市到任意一个其他的城市都是有可能的,且任意两个不同城市之间的路径是唯一的。
一条路径 的长度是这条路径上连接相邻城市的 条道路的长度之和。
在建国日,政府会在特定时刻封锁城市。每个城市被分配一个非负的封锁时刻 (),且所有 之和不得超过 。
考虑城市 和某个封锁时刻分配方案,城市 是从城市 可达的,当且仅当满足以下两种情况之一:
- 情况 1:;
- 情况 2: 与 之间的路径 ( 且 )满足:路径 的长度 ,路径 的长度 ,……,路径 的长度 。
今年,两个主要庆祝地点位于城市 和 。对于每一个封锁时刻分配方案,便利分数定义为“从 可达的城市个数”与“从 可达的城市个数”之和(若一个城市从 和 均可达,计算两次)。
你的任务是计算能被某个封锁时刻分配方案实现的最大便利分数。
实现细节
你需要在程序开始引入库 closing.h
,并实现以下函数:
int max_score(int N, int X, int Y, int64 K, int[] U, int[] V, int[] W)
参数说明
- :城市的个数;
- :两个主要庆祝城市的编号;
- :封锁时刻总和的上界;
- :长度为 的数组,描述道路连接情况(第 条道路连接 和 );
- :长度为 的数组,描述道路长度(第 条道路的长度为 )。
返回要求
返回能被某个封锁时刻分配方案实现的最大便利分数。每个测试用例可多次调用该函数。
例子
例子 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])
这对应以下道路网络:
假设封锁时刻如下分配:
城市 | |||||||
---|---|---|---|---|---|---|---|
封锁时刻 |
注意所有封锁时刻之和为 9,不超过 K = 10。城市 0, 1 和 3 都是从城市 X (X = 0) 可达的,而城市 1, 2 和 4 都可以从城市 Y (Y = 2) 可达。 因此,便利分数为 3+3 = 6。不存在封锁时刻分配方案使得便利分数大于 6,所以该函数应该返回 6。
例子 2
考虑以下函数调用:
max_score(4, 0, 3, 20, [0, 1, 2], [1, 2, 3], [18, 1, 19])
假设封锁时间如下分配:
城市 | ||||
---|---|---|---|---|
封锁时刻 |
城市 0 从城市 X (X = 0) 可达,而城市 2 和 3 都是可以从城市 Y (Y=3) 可达的。因此,便利分数是 1 + 2 = 3。不存在封锁时刻分配方案使得便利分数大于 3,所以函数应该返回 3。
约束条件
- ;
- ;
- ;
- 对每个 (),;
- 对每个 (),;
- 城市间道路构成连通图;
- 所有调用
max_score
的 之和 。
子任务
若道路网络是线性的(即第 条道路连接城市 和 ,),则对应以下子任务: | 子任务 | 附加限制 | 分值 | |--------|----------|------| | 1 | 从 到 的路径长度 | | | 2 | ,道路网络线性 | | | 3 | ,道路网络线性 | | | 4 | ,道路网络线性 | | | 5 | | | | 6 | | | | 7 | | | | 8 | | | | 9 | 无额外约束 | |
评测程序示例
输入格式
- 第 行:(场景数,即调用
max_score
的次数); - 接下来 个场景,每个场景格式如下:
- 第 行:;
- 第 行():。
输出格式
对每个场景,输出一行 max_score
的返回值。