题目背景
请勿用 C++14 (GCC 9) 提交。
你需要在程序开头加入如下代码:
#include<vector>
int travel(std::vector<int> U, std::vector<int> V, std::vector<int> W);
题目描述
题目译自 2024년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사 T4 「철도 2」
IOI 国有 N 个城市和连接这些城市的 N−1 条双向铁路,任意两个不同的城市都可以通过铁路互相到达。也就是说,IOI 国的铁路网络是一个树结构。城市编号从 0 到 N−1,铁路编号从 0 到 N−2。对于每条编号为 i 的铁路,它连接了编号为 U[i] 和 V[i] 的城市,长度为 W[i]。
在 IOI 国的任何一个城市出发,都可以乘坐直达列车直接到达另一个城市。也就是说,对于所有 u,v (0≤u,v≤N−1,u=v) 的 N(N−1) 个城市对 (u,v),从 u 城市出发到达 v 城市的直达列车存在。乘坐这趟直达列车时,直到到达 v 城市之前不能下车,这趟列车的耗时等于 IOI 国铁路网络中从 u 城市到 v 城市的唯一简单路径上所有铁路的长度之和。
作为铁路爱好者,你喜欢长时间乘坐一列火车,享受悠闲的时光。因此,乘坐耗时长的直达列车会让你感到更大的乐趣。
具体来说,对于两个不同的城市 x,y,乐趣 joy(x,y) 定义为满足以下条件的最大正整数 D:
- 从 x 城市出发,乘坐耗时至少为 D 的直达列车,经过有限次后到达 y 城市。
你需要编写一个程序,计算满足 0≤x,y≤N−1,x=y 的所有 N(N−1) 个城市对 (x,y) 的 joy(x,y) 之和,并对 1000000007(=109+7) 取模。
你需要实现以下函数:
int travel(std::vector<int> U, std::vector<int> V, std::vector<int> W);
- 该函数只会被调用一次。
U, V, W
:大小为 N−1 的整数数组。对于每个 i (0≤i≤N−2),存在一条连接 U[i] 和 V[i] 的长度为 W[i] 的铁路。
- 该函数需要返回满足 0≤x,y≤N−1,x=y 的所有 N(N−1) 个城市对 (x,y) 的 joy(x,y) 之和,并对 1000000007(=109+7) 取模。
注意,提交的代码中不应包含任何输入输出操作。
输入格式
示例评测程序按以下格式读取输入:
- 第 1 行:N
- 第 2+i (0≤i≤N−2) 行:U[i]V[i]W[i]
输出格式
示例评测程序将输出:
5
0 1 1
1 2 2
0 3 3
0 4 2
80
5
0 1 3
0 2 2
0 3 2
0 4 1
78
6
0 1 3
1 2 1
2 3 4
3 4 1
4 5 5
284
提示
对于所有输入数据,满足:
- 2≤N≤5⋅105
- IOI 国的铁路网络是一个树结构
- 对于所有 i (0≤i≤N−2),0≤U[i],V[i]≤N−1;U[i]=V[i]
- 对于所有 i (0≤i≤N−2),1≤W[i]≤109
详细子任务附加限制及分值如下表所示。
子任务 |
分值 |
附加限制 |
1 |
3 |
N≤50 |
2 |
6 |
N≤500 |
3 |
19 |
N≤2000 |
4 |
5 |
N≤8000; 对于所有 i (0≤i≤N−2),U[i]=0 |
5 |
7 |
N≤8000; 对于所有 i (0≤i≤N−2),U[i]=i,V[i]=i+1 |
6 |
15 |
N≤8000 |
7 |
4 |
对于所有 i (0≤i≤N−2),U[i]=0 |
8 |
11 |
对于所有 i (0≤i≤N−2),U[i]=i;V[i]=i+1 |
9 |
30 |
无附加限制 |