#P13692. [CEOI 2025] lawnmower

[CEOI 2025] lawnmower

Description

在经历了 Poenari 城堡的冒险之后,Vlad 回到家,作为一个真正的罗马尼亚人,他的第一想法就是应该先喂他的马。马对食物要求不高,所以 Vlad 直接把自家草坪当作主要饲料来源。

为此,Vlad 有一台容量为 cc 的割草机。他决定将草坪划分为 nn 条割草道,编号从 00n1n - 1,并且必须按顺序割完。第 ii 条割草道上有 v[i]v[i] 数量的未割草,由于一些未知原因,Vlad 推割草机经过这一条需要 a[i]a[i] 秒。

在经过几条割草道后,割草机的收集箱可能会达到满容量,此时它将停止割草,剩下的草会留在该条道上。每当出现这种情况时,必须在该条道的末端清空收集箱,这需要花费 bb 秒。清空只能在割草道的末端进行。如果在经过第 ii 条割草道时收集箱已满,Vlad 仍需要推到该条道的末端,再清空收集箱,然后重新经过该条道一次(或多次),直到割完剩余的草。

例如,如果某条第 ii 条割草道需要经过 33 次才能割完全部草,则所需时间为:

a[i]+b+a[i]+b+a[i]a[i] + b + a[i] + b + a[i]

在整个草坪割完后,割草机也必须清空一次。

经过一番思考并抱怨说割完需要花费太久,Vlad 得出结论:有时候提前清空收集箱(即便还没满)可能会更节省时间,但他不确定最佳策略。因此他请求你的帮助。

给定每条割草道上的草量、经过该条所需的时间、收集箱容量以及清空所需的时间,求 Vlad 在最短时间内完成割草的最佳策略所需的总时间。

Input Format

实现细节

你需要实现以下过程:

long long mow(int n, int c, int b, std::vector<int> &a, std::vector<int> &v);
  • nn:草坪的割草道数量
  • cc:收集箱的总容量
  • bb:清空收集箱所需的秒数
  • aa:长度为 nn 的数组,表示经过每条割草道所需的时间
  • vv:长度为 nn 的数组,表示每条割草道上的草量

该过程应返回一个整数,表示完成割草的最短时间。

该过程在每个测试用例中恰好调用一次。

3 5 2
2 10 3
2 4 6
24
4 10 4
1 2 1 4
3 2 6 7
17

Hint

样例解释 1

考虑如下调用:

mow(3, 5, 2, {2, 10, 3}, {2, 4, 6})

在此样例中,有 33 条割草道,收集箱容量为 55,清空需要 22 秒。

第一条道,Vlad 割完需要 22 秒,此时收集箱中有 22 单位的草。他选择立即清空(花费 22 秒)。第一条道总共用时 44 秒。

第二条道,割 44 单位草。他选择不清空,第二条道用时 1010 秒。

第三条道,开始割草后割到 11 单位草时收集箱已满,因此他推到道末(用 33 秒),清空收集箱(用 22 秒),然后重新割第三条道(用 33 秒)。整个草坪割完后还需要清空一次(用 22 秒)。第三条道总用时 3+2+3+2=103 + 2 + 3 + 2 = 10 秒。

总用时 4+10+10=244 + 10 + 10 = 24 秒。可以证明这是 Vlad 割草的最优策略。

数据范围

  • 1n2000001 \leq n \leq 200000
  • 对于每个 0i<n0 \leq i < n1a[i]1091 \leq a[i] \leq 10^9
  • 对于每个 0i<n0 \leq i < n1v[i]1091 \leq v[i] \leq 10^9
  • 1b1091 \leq b \leq 10^9
  • 1c1091 \leq c \leq 10^9

保证正确答案不超过 101810^{18}

子任务

  1. (9 分)所有给定值(nnbbcca[i]a[i]v[i]v[i])均不超过 200200
  2. (16 分)n,c5000n, c \leq 5000 且对所有 0i<n0 \leq i < nv[i]5000v[i] \leq 5000
  3. (36 分)c200000c \leq 200000
  4. (17 分)a[0]=a[1]==a[n1]a[0] = a[1] = \ldots = a[n - 1]
  5. (22 分)无额外限制

翻译由 ChatGPT-5 完成