luogu#P16707. [SEATST 2026] 车辆集结 / Car Gathering

[SEATST 2026] 车辆集结 / Car Gathering

题目描述

数轴上有 NN 辆汽车,编号从 00N1N - 1 。给定它们的位置列表 X[0],X[1],,X[N1]X[0], X[1], \ldots, X[N - 1] 以及它们每单位的耗油率列表 C[0],C[1],,C[N1]C[0], C[1], \ldots, C[N - 1] ,每个列表都已按顺序排序。然而,你不知道哪辆汽车对应哪个位置或哪个耗油率。但你知道每辆汽车都有确切的一个位置和确切的一个耗油率。

也就是说,存在两个长度为 NN 的排列 PPQQ ,使得第 ii 辆汽车位于位置 X[P[i]]X[P[i]] 且其耗油率为 C[Q[i]]C[Q[i]]

::::info[什么是长度为 NN 的排列?]{open} 在这道题中,长度为 NN 的排列 PP 是一个长度为 NN 的数组,满足对于所有 0iN10 \le i \le N - 1 都有 0P[i]N10 \le P[i] \le N - 1 ,并且对于所有 0i<jN10 \le i < j \le N - 1 都有 P[i]P[j]P[i] \ne P[j]

例如,[2,1,0][2, 1, 0] 是一个长度为 33 的排列,但 [1,2,3][1, 2, 3][2,0,2][2, 0, 2] 不是长度为 33 的排列。 ::::

给定一个特定的分配 (P,Q)(P, Q) ,我们将所有汽车集结在点 yy 的总燃料成本定义为 $\text{cost}(P, Q, y) = \sum_{i=0}^{N-1} |X[P[i]] - y| \times C[Q[i]]$ 。

给定一个 整数pp ,定义在点 pp最坏情况燃料成本 为所有可能的分配 (P,Q)(P, Q) 下的最大总燃料成本。也就是说,定义 $\text{worst}(p) = \max \limits_{P, Q} \text{cost}(P, Q, p)$ 。

你的任务是找一个整数点 pp ,使得在点 pp 的最坏情况燃料成本 worst(p)\text{worst}(p) 最小化。如果有多个点 pp 都能达到相同的 worst(p)\text{worst}(p) 最小值,你可以返回其中任意一个。

实现详情

你需要实现以下函数。

int car_gathering(int N, std::vector<int> X, std::vector<int> C)
  • NN :汽车的数量。
  • XX :一个长度为 NN 的数组,描述了按顺序排序的汽车位置。
  • CC :一个长度为 NN 的数组,描述了按顺序排序的汽车油耗率。
  • 对于每个测试数据,此函数恰好被调用一次。
  • 此函数应返回一个整数 pp ,使得在所有整点中,将所有汽车集结在 pp 点的最坏情况燃料成本最小。

输入格式

N
X[0] X[1] ... X[N - 1]
C[0] C[1] ... C[N - 1]

输出格式

一个整数,表示 car_gathering 的返回值。

提示

样例

考虑以下函数调用:

car_gathering(3, [-1, 2, 3], [1, 1, 2])

假设 p=1p = 1 。可以证明,分配 P=[0,1,2]P = [0, 1, 2]Q=[2,1,0]Q = [2, 1, 0] 会产生 最坏情况燃料成本 。也就是说, $\text{worst}(p) = \text{cost}(P, Q, p) = (|-1 - 1| \times 2) + (|2 - 1| \times 1) + (|3 - 1| \times 1) = 7$ 。请注意,可能还有其他 PPQQ 的分配方式也能产生 最坏情况燃料成本 ,例如 P=[2,1,0]P = [2, 1, 0]Q=[2,1,0]Q = [2, 1, 0]

同时也可以证明,整数点 p=1p = 1 是导致 worst(p)\text{worst}(p) 最小值的点。因此,该函数调用该返回 1。

约束

  • 1N10 000 0001 \le N \le 10\ 000\ 000
  • 对于所有 0iN10 \le i \le N - 1109X[i]109-10^9 \le X[i] \le 10^9
  • 对于所有 0iN10 \le i \le N - 10C[i]1000 \le C[i] \le 100
  • 对于所有 0i<jN10 \le i < j \le N - 1X[i]X[j]X[i] \le X[j]
  • 对于所有 0i<jN10 \le i < j \le N - 1C[i]C[j]C[i] \le C[j]

子任务

  1. (1010 分) N1000N \le 1000X[i]103|X[i]| \le 10^3
  2. (2323 分) N100 000N \le 100\ 000
  3. (1717 分) N1 000 000N \le 1\ 000\ 000
  4. (3131 分) 对于所有 0iN10 \le i \le N - 1C[i]1C[i] \le 1
  5. (1919 分) 没有额外的约束。