#2030. 「IOI 2023」封锁时刻

内存限制:2048 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: HHOJ

题目描述

匈牙利有 个城市,编号依次为

这些城市之间由 条双向道路连接,编号为 。对每个 ),第 条道路连接城市 和城市 ,其长度为 ,表示这两个城市之间的交通时间为 个时间单位。每条道路连接两个不同的城市,且每两个城市之间最多由一条道路连接。

两个不同城市 之间的一条路径 是一个由不同城市组成的序列 ,满足以下条件:

  • ,
  • ,
  • 对每个 (), 存在一条道路连接

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

一条路径 长度是这条路径上连接相邻城市的 条道路的长度之和。

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

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

情况 1:

情况 2:这两个城市之间的路径 )满足以下条件:

  • 路径 的长度最多为 ,并且
  • 路径 的长度最多为 ,并且
  • 路径 的长度最长为

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

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

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

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

实现细节

你需要在程序开始引入库 closing.h

你要实现以下函数。

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

例子

考虑以下调用:

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

这对应以下道路网络:

closing-sample1.png

假设封锁时刻如下分配:

城市
封锁时刻

注意所有封锁时刻之和为 ,不超过 。城市 都是从城市 () 可达的,而城市 , 都可以从城市 () 可达。 因此,便利分数为 。不存在封锁时刻分配方案使得便利分数大于 ,所以该函数应该返回

考虑另外一个调用:

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

这对应以下道路网络:

closing-sample2.png

假设封锁时间如下分配:

城市
封锁时刻

城市 从城市 () 可达,而城市 都是可以从城市 () 可达的。因此,便利分数是 。不存在封锁时刻分配方案使得便利分数大于 ,所以函数应该返回

约束条件

  • (对每个 满足 )
  • (对每个 满足 )
  • 利用这些道路可以从任意一个城市走到任意另外一个城市。
  • ,其中 是所有调用函数 max_score 的总和。

子任务

我们说一个道路网络是线性的如果道路 连接城市 (对每个)。

  1. (8 分)从城市 到城市 的路径长度大于
  2. (9 分),道路网络是线性的。
  3. (12 分),道路网络是线性的。
  4. (14 分),道路网络是线性的。
  5. (9 分)
  6. (11 分)
  7. (10 分)
  8. (10 分)
  9. (17 分)无额外的约束条件。

评测程序示例

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

  • 行:

以下是 个场景的描述。

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

  • 行:
  • 行 ():

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

  • 行: max_score 的返回值