#P14536. [OII 2025] 路灯收集 / Raccogli i lampioni

[OII 2025] 路灯收集 / Raccogli i lampioni

题目背景

译自 Italian Olympiad in Informatics (OII) 2025 - Raccogli i lampioni

OII 纪念碑的建造场地终于被清理干净了!工作人员现在需要考虑的是该区域的照明工作。购买新的路灯是不可能的,因为大部分资金都花在了木材运输上。一个更现实的方案是从乌迪内市借用一些路灯。

题目描述

乌迪内市有 NN 个路口,被 MM 条双向道路所连接。在路口 i(0i<N)i(0\le i<N),有一盏高度为 HiH_i 的路灯。第 j(0j<M)j(0\le j<M) 条道路连接编号为 AjA_jBjB_j 的路口,长度为 LjL_j

要借用一盏路灯 HiH_i,必须将其放倒在一条连接了路口 ii 的道路上,前提是这条路上要有足够的空间:也就是说,放倒在第 jj 条道路上的路灯长度之和不能超过 LjL_j

请帮助工作人员确定能借用的最大路灯数量。

  • 两个路口之间可能有多于一条道路。此外,不能保证每个路口都可以通过道路与其他所有路口相连。

实现细节

附件中包含一个实现示例 benilluminato.cpp

你需要实现如下函数:

int illumina(int N, int M, vector<int> H, vector<int> A, vector<int> B, vector<int> L);
  • 整数 NN:路口的数量。
  • 整数 MM:道路的数量。
  • 数组 HH:下标从 00N1N-1,包含每个路口上路灯的高度。
  • 数组 A,BA,BLL:下标从 00M1M-1,描述了道路,其中第 jj 条道路连接路口 AjA_{j}BjB_{j},长度为 LjL_{j} 米。
  • 该函数需要返回能借用的最大路灯数量。
  • 对于每个测试点,该函数都只会被调用一次。

输入格式

评测程序的输入格式如下:

  • 11 行:两个整数 NNMM
  • 22 行:NN 个整数 H0,H1,,HN1H_0,H_1,\ldots,H_{N-1}
  • 2+j2 + j 行(0j<M0 \le j < M):三个整数 Aj,Bj,LjA_j,B_j,L_j

输出格式

评测程序的输出格式如下:

输出一行一个整数,表示函数 illumina 的返回值。

4 3
4 2 3 3
0 1 4
0 2 6
0 3 8
4
8 10
3 2 3 2 4 6 5 9
0 1 4
1 2 1
2 3 3
3 4 1
0 4 8
2 5 8
3 5 7
1 6 4
5 7 3
6 7 10
7
2 2
5 6
0 1 5
0 1 9
2

提示

【样例解释】

在样例 1 中,如下的方案可以最大化借用的路灯数量(可以借用所有路灯):

  • 将路灯 00 和路灯 33 放倒在道路 22 上;
  • 将路灯 11 放倒在道路 00 上;
  • 将路灯 22 放倒在道路 11 上。

在样例 2 中,如下的方案可以最大化借用的路灯数量(不能借用所有的 88 盏路灯,但是可以借用 77 盏):

  • 将路灯 00 和路灯 44 放倒在道路 44 上;
  • 将路灯 11 放倒在道路 00 上;
  • 将路灯 22 放倒在道路 55 上;
  • 将路灯 33 放倒在道路 22 上;
  • 将路灯 55 放倒在道路 66 上;
  • 将路灯 66 放倒在道路 99 上。

在样例 3 中,如下的方案可以最大化借用的路灯数量(可以借用所有路灯):

  • 将路灯 00 放倒在道路 00 上;
  • 将路灯 11 放倒在道路 11 上。

【数据范围】

  • 1N,M1061\le N,M\le 10^6
  • 1Hi10001\le H_i\le 1000
  • 0Aj,Bj<N0\le A_j,B_j<NAjBjA_j\neq B_j
  • 1Lj20001\le L_j\le 2000

【子任务】

子任务编号 分值 约束条件
00 样例
11 66 N,M10N,M\le 10
22 1111 M=N1M=N-1Aj=jA_j=jBj=j+1B_j=j+1Hi=1H_i=1
33 1616 M=N1M=N-1Aj=jA_j=jBj=j+1B_j=j+1
44 2727 Hi=1H_i=1Lj=1L_j=1
55 1212 Hi=1H_i=1
66 2828 无额外限制