P14535 [OII 2025] 木材运输 / Trasporto tronchi

题目背景

译自 [Italian Olympiad in Informatics (OII) 2025 - Trasporto tronchi](https://training.olinfo.it/task/oii_alberi)。 OII 2025 纪念碑的建造准备工作已经开始。为了清理场地,一些树木被砍伐,现在需要将它们装上卡车运往木工车间。

题目描述

初始时,第 $i$ 棵树位于位置 $A_i$,卡车位于位置 $0$。 在开始装载之前,可以对一些树木进行修剪:修剪一棵树的成本为 $K$,可以使树干变得光滑,从而可以在其他光滑的树干上滚动。 树木可以通过两种方式移动: - 任何树都可以向卡车方向移动一个位置(该位置必须是空的),代价为 $1$。 - 如果一棵**被修剪的**树的紧左侧有一个或多个连续的**被修剪的**树,并且这些树左侧紧接着一个空位,那么这棵树可以在这些树上滚动(但不能在未修剪的树或地面上滚动)直到到达空位,代价为 $1$。 卡车所在的位置被视为一个空位置。 请帮助组织者确定将所有树木装上卡车的最小代价。 ### 实现细节 附件中包含一个实现示例 `alberi.cpp`。 你需要实现如下函数: ``` long long carica(int N, int K, vector A); ``` - $N$:树木的数量。 - $K$:修剪一棵树的成本。 - $A$:下标从 $0$ 到 $N-1$,包含树木的初始位置。 - 该函数需要返回将所有树木带到位置 $0$ 的最小代价。 - 对于每个测试点,该函数都只会被调用一次。

输入格式

评测程序的输入格式如下: - 第 $1$ 行:$N\ K$ - 第 $2$ 行:$A_0\ A_1\ \ldots\ A_{N-1}$

输出格式

评测程序的输出格式如下: 输出一行一个整数,表示函数 `carica` 的返回值。

说明/提示

#### 【样例解释】 在样例 1 中,一种使代价最小的方案为: - 对位置在 $5,6$ 的树进行修剪; - 在修剪之后只需要 $7$ 次移动,总代价为 $7+2\cdot 2=11$。 ![](https://cdn.luogu.com.cn/upload/image_hosting/jp3vo8g9.png) 在样例 2 中,一种使代价最小的方案是修剪除了第一棵树之外的所有树。 #### 【数据范围】 - $1 \leq N \leq 5\times 10^5$; - $0 \leq K \leq 10^9$; - $1 \leq A_i \leq 10^9$; - $A_i < A_{i+1}$。 #### 【子任务】 | 子任务编号 | 分值 | 约束条件 | | :----: | :--: | :------: | | $0$ | $0$ | 样例 | | $1$ | $11$ | $K = 10^9$ | | $2$ | $17$ | $K = 0$,$N \leq 500$ 且 $1 \leq A_i \leq 2000$ | | $3$ | $22$ | $K = 0$ | | $4$ | $23$ | $K \leq 2000$,$N \leq 500$ 且 $1 \leq A_i \leq 2000$ | | $5$ | $27$ | 无额外限制 |