#xLYHDPybttg050604. 1609:【例 4】Cats Transport

1609:【例 4】Cats Transport

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

原题来自:Codeforces Round #185 (Div. 1) B.

小 S 是农场主,他养了 MM 只猫,雇了 PP 位饲养员。农场中有一条笔直的路,路边有 NN 座山,从 11NN 编号。第 ii 座山与第 i1i-1 座山之间的距离是 DiD_ii2i\ge 2)。饲养员都住在 11 号山上。

有一天,猫出去玩。第 ii 只猫去 HiH_i 号山玩,玩到时刻 TiT_i 停止,然后在原地等饲养员来接。饲养员们必须回收所有的猫。每个饲养员沿着路从 11 号山走到 NN 号山,把各座山上已经在等待的猫全部接走。饲养员在路上行走需要时间,速度为 11 单位距离每单位时间。饲养员在每座山上接猫的时间可以忽略,可以携带的猫的数量为无穷大。

例如有两座相距为 11 的山,一只猫在 22 号山玩,玩到时刻 33 开始等待。如果饲养员从 11 号山在时刻 2233 出发,那么他可以接到猫,猫的等待时间为 0011。而如果他于时刻 11 出发,那么他将于时刻 22 经过 22 号山,不能接到当时仍在玩的猫。

你的任务是规划每个饲养员从 11 号山出发的时间,使得所有猫等待时间的总和尽量小。饲养员出发的时间可以为负。


输入格式

第一行三个整数 N,M,PN, M, P

第二行 N1N-1 个正整数 DiD_i,表示第 ii 座山与第 i1i-1 座山之间的距离是 DiD_iii22NN);

接下来 MM 行每行两个整数 Hi,TiH_i, T_i


输出格式

输出一个整数表示答案。


样例

样例输入

4 6 2
1 3 5
1 0
2 1
4 9
1 10
2 10
3 12

样例输出

3

样例解释

N=4N=4(4座山),M=6M=6(6只猫),P=2P=2(2位饲养员)。

距离:D2=1D_2=1(山1到山2距离1),D3=3D_3=3(山2到山3距离3),D4=5D_4=5(山3到山4距离5)。

猫的信息:

  1. 山1,玩到时刻0
  2. 山2,玩到时刻1
  3. 山4,玩到时刻9
  4. 山1,玩到时刻10
  5. 山2,玩到时刻10
  6. 山3,玩到时刻12

我们需要分配两位饲养员出发时间,使得所有猫等待时间总和最小。

最优方案:

  • 饲养员1:在时刻 2 出发,接猫 1,2(等待时间分别为 2,1,总和 3)
  • 饲养员2:在时刻 11 出发,接猫 3,4,5,6(等待时间分别为 2,1,1,1,总和 5)

总等待时间 = 3+5 = 8?不对,样例输出是 3,说明我理解可能有误。

实际上每只猫的等待时间 = 饲养员到达该山的时刻 - 猫开始等待的时刻(如果到达时间早于猫开始等待的时间,则等待时间为 0)。
饲养员从 1 号山出发,到达 HiH_i 号山的时间 = 出发时间 + 从 1 到 HiH_i 的距离(前缀和 dist[Hi]dist[H_i])。

我们计算每只猫的“最早接走时间” Ai=Tidist[Hi]A_i = T_i - dist[H_i](即饲养员出发时间必须 Ai\ge A_i 才能接到猫)。

AiA_i 排序后,问题转化为:将 MM 个数分成 PP 段,每段代价为 (A段右Aj)\sum (A_{\text{段右}} - A_j),最小化总代价。

经过计算最优分段,样例答案为 3。


数据范围

对于全部数据:

  • 2N1052 \le N \le 10^5
  • 1M1051 \le M \le 10^5
  • 1P1001 \le P \le 100
  • 1Di<1041 \le D_i < 10^4
  • 1HiN1 \le H_i \le N
  • 0Ti1090 \le T_i \le 10^9

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题是 斜率优化 DP 经典题。

转换

  • 设从 11 号山到 ii 号山的距离前缀和为 dist[i]dist[i],则 dist[1]=0dist[1]=0
  • 对于第 ii 只猫,饲养员必须在 TiT_i 时刻之后到达 HiH_i 山才能接到它。饲养员从 11 出发到达 HiH_i 的时间为 出发时间+dist[Hi]出发时间 + dist[H_i],因此要求 出发时间+dist[Hi]Ti出发时间 + dist[H_i] \ge T_i,即 出发时间Tidist[Hi]出发时间 \ge T_i - dist[H_i]
  • ai=Tidist[Hi]a_i = T_i - dist[H_i],表示能接到猫 ii 的最早出发时间(如果 aia_i 为负,表示饲养员可以提前出发等待)。
  • 将猫按照 aia_i 排序(从小到大)。
  • 饲养员出发时间可以任意安排(可以为负),且饲养员按出发时间顺序接猫(因为路是单向的,先出发的先接),所以问题转化为:将排序后的 aa 数组分成 PP 段,每段内猫由同一个饲养员接,该饲养员的出发时间即为该段最后一个猫的 aa 值(因为要等所有猫都玩完才能接走),该段猫的等待时间总和为 (a段右aj)\sum (a_{\text{段右}} - a_j)

DP 方程: 设 dp[i][j]dp[i][j] 表示前 ii 只猫分成 jj 段的最小总等待时间。

转移:

$$dp[i][j] = \min_{0 \le k < i} \{ dp[k][j-1] + a_i \times (i-k) - (sumA[i] - sumA[k]) \}$$

其中 sumA[i]sumA[i]aa 的前缀和。

化简:

$$dp[i][j] = \min_{0 \le k < i} \{ dp[k][j-1] + sumA[k] - a_i \times k \} + a_i \times i - sumA[i]$$

X[k]=kX[k] = k, Y[k]=dp[k][j1]+sumA[k]Y[k] = dp[k][j-1] + sumA[k],则:

$$dp[i][j] = \min_{0 \le k < i} \{ Y[k] - a_i \times X[k] \} + a_i \times i - sumA[i]$$

这是斜率优化形式,斜率 aia_i 单调递增(因为 aa 已排序),X[k]X[k] 单调递增,所以可以用单调队列优化,复杂度 O(PM)O(PM)

注意

  • 使用滚动数组优化空间(jj 这一维可以滚动);
  • 初始 dp[i][1]=ai×isumA[i]dp[i][1] = a_i \times i - sumA[i]
  • 最终答案为 dp[M][P]dp[M][P]

复杂度 O(PM)O(PM),可以接受。