#P15656. [Bulgarian2025训练营]Flashlights手电筒
[Bulgarian2025训练营]Flashlights手电筒
题目描述
我们可以把 Stara Planina 山脉表示为平面上的一列 个山峰。山峰编号为 到 ,第 个山峰的坐标为 ,其中 表示第 个山峰的海拔。
保证 是 的一个排列。相邻山峰 与 之间用线段相连。
由于夜间行走,要到达山上的任意位置,必须至少有一个正在工作的手电筒。现在有 个手电筒可以买。第 个手电筒可以在山峰 处以 欧元购买,并且只在当前海拔属于区间 时工作。
当海拔低于 或高于 时,手电筒不工作。手电筒离开工作区间不会损坏,之后回到工作区间时会重新工作。
如果当前位于山峰 ,可以执行以下操作之一:
- 购买一个在山峰 出售的手电筒,购买后可一直持有;
- 若 ,走到山峰 ;
- 若 ,走到山峰 。
没有正在工作的手电筒时不能移动。在两个相邻山峰之间移动时,沿线段上的每一个位置都必须至少有一个当前持有的手电筒正在工作。移动过程中工作的手电筒不必始终是同一个。
例如,当前海拔为 ,要走到相邻的海拔 的山峰。如果持有工作区间为 和 的两个手电筒,则可以成功移动;但如果只持有区间为 和 的手电筒,则无法移动,因为在海拔 时没有任何手电筒工作。
对于每个 ,请判断:如果一开始位于山峰 并购买手电筒 ,是否可以遍历整座山,即访问每个山峰至少一次。若可以,请求出总购买费用的最小值;该费用包含初始购买手电筒 的费用。
输入格式
第一行包含两个正整数 ,表示山峰数量和可购买手电筒数量。
第二行包含 个整数 。
接下来 行,每行四个整数 ,表示手电筒 可在山峰 购买,价格为 ,工作海拔区间为 。
输出格式
对每个 ,输出一行:
- 如果从山峰 开始并购买手电筒 后,可以遍历整座山,则输出最小总费用;
- 如果不可能遍历整座山,或 ,输出
-1。
数据范围
- 是 到 的一个排列
子任务
| 子任务 | 分值 | 依赖子任务 | 其他限制 | ||
|---|---|---|---|---|---|
| 0 | - | - | 样例 | ||
| 1 | 9 | - | |||
| 2 | 12 | 0-1 | |||
| 3 | 23 | - | |||
| 4 | 16 | 0-3 | - | ||
| 5 | 40 | 0-4 | |||
只有通过某子任务及其所有依赖子任务的全部测试,才能获得该子任务分数。
样例
输入
7 8
4 2 3 1 5 6 7
3 1 2 4
1 2 1 3
4 4 1 7
6 10 1 7
6 20 6 6
6 30 5 5
7 40 1 6
7 50 7 7
输出
7
-1
4
10
30
-1
-1
-1
说明
如果先在山峰 购买手电筒 ,可以:
- 向左走到山峰 ;
- 购买手电筒 ;
- 向右走到山峰 ;
- 购买手电筒 ;
- 向右走到山峰 。
此时已经访问所有山峰,花费为 。
不能以手电筒 作为初始手电筒,因为它们在出售处的海拔不工作。手电筒 作为初始手电筒时无需再购买额外手电筒。手电筒 作为初始手电筒时还需要之后购买手电筒 。若以手电筒 开始,会停留在山峰 ,即使在山峰 买到手电筒,仍不能走到山峰 。