#P14596. [Bulgarian2025秋季赛]cleanup

[Bulgarian2025秋季赛]cleanup

题目描述

就在所有人都没有预料到的时候……萨什卡回来了。

在索菲亚轰轰烈烈的垃圾清理事件中,萨什卡最喜欢的一条街道上堆满了秋天落下的树叶。由于她非常热爱整洁,她决定亲自把街道的人行道清理干净。

更准确地说,人行道长度为 NN 米,被分成了 NN 个长度均为 11 米的区间,从左到右依次编号为 1,2,,N1,2,\dots,N。第 ii 个区间中堆有 ViV_i 立方米的树叶。每立方米树叶重 11 千克。

在人行道最左端再往左 11 米处,有一个装垃圾袋的地方,共有 KK 个垃圾袋。每个垃圾袋都足以装下整条人行道上的全部树叶。每个垃圾袋本身重量为 CC。为方便起见,记垃圾袋来源点的位置为 00

初始时,萨什卡站在位置 00。为了完成清理,她可以执行若干操作。设她当前站在位置 XX,并且正携带总重量为 WW 的东西(即垃圾袋本身重量与袋中树叶重量之和),那么她可以:

  • 从当前所在区间收集 11 千克树叶放入袋中,即令 VXVX1V_X \to V_X-1。要求 X>0X>0VX>0V_X>0。该操作消耗 0 单位体力。
  • 向左移动一个区间,即 XX1X \to X-1。要求 X>0X>0。该操作消耗 WW 单位体力。
  • 向右移动一个区间,即 XX+1X \to X+1。要求 X<NX<N,并且 当前位置的树叶必须已经清空,也就是 VX=0V_X=0,否则她无法穿过树叶。该操作消耗 WW 单位体力。
  • 在垃圾袋来源点放下当前的装叶袋。要求 X=0X=0,且当前手上拿着一个装过树叶的袋子。该操作消耗 0 单位体力。
  • 在垃圾袋来源点拿起一个垃圾袋。要求 X=0X=0,且当前没有拿着装叶袋。该操作消耗 0 单位体力。

清理完成时,目标是:

  • 人行道上的所有树叶都已经被装进垃圾袋;
  • 所有垃圾袋都位于起点位置 00

请你编写程序 cleanup,求完成清理所需的最小体力值。

实现细节

你需要实现如下函数:

long long solve(const std::vector<long long> &V, int K, long long C)
  • V:长度为 NN 的数组,表示树叶数量。其中 V1=V[0],V2=V[1],,VN=V[N1]V_1 = V[0], V_2 = V[1], \dots, V_N = V[N-1]
  • K:垃圾袋数量。
  • C:每个垃圾袋的重量。

该函数对每个测试点只会被调用一次,你需要返回一个整数,表示最小体力值。

输入格式(本地评测器)

  • 第一行三个整数 N,K,CN,K,C,表示人行道长度、垃圾袋数量以及每个垃圾袋的重量。
  • 第二行 NN 个正整数 V1,V2,,VNV_1,V_2,\dots,V_N,表示每个区间上的树叶数量。

输出格式(本地评测器)

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

样例 #1

输入

7 4 1
4 3 6 8 2 10 1

输出

199

样例 #2

输入

8 2 1
2 1 1 3 1 2 1 4

输出

133

样例 #3

输入

8 2 100
2 1 1 3 1 2 1 4

输出

1765

数据范围

  • 1KN1061 \le K \le N \le 10^6
  • 0C10120 \le C \le 10^{12}
  • 1Vi10121 \le V_i \le 10^{12}
  • i=1NVi1012\sum_{i=1}^{N} V_i \le 10^{12}

子任务

子任务 分值 需要通过的子任务 NN 范围 其他限制
0 - - 样例
1 5 106\le 10^6 K=1K=1
2 8 0 20\le 20 -
3 10 0,2 300\le 300
4 18 0,2-3 20000\le 20000 K400K \le 400
5 9 0,2-4 100000\le 100000 K900K \le 900
6 35 0,2-5 300000\le 300000 -
7 15 0-6 106\le 10^6

只有当某个子任务以及其所依赖的所有子任务全部通过时,才能获得该子任务的分数。