P17241 [IOI 2026] 纪念碑 / monuments

题目描述

撒马尔罕著名的雷吉斯坦广场内有 $N$ 座纪念碑,它们排列成一条穿过广场中心的直线。这些纪念碑的编号从 $0$ 到 $N-1$。编号为 $i$($0\le i0$,位于坐标 $x$ 处的纪念碑数量必须等于位于坐标 $-x$ 处的纪念碑数量。坐标 $0$ 上可以放置任意数量的纪念碑(数量可能为零)。 然而,有 $M$ 座古老纪念碑年久失修导致无法移动。它们的编号为 $P[0],P[1],\ldots,P[M-1]$。这 $M$ 座纪念碑必须停留在其原始坐标上,其余 $N-M$ 座纪念碑可以移动到任意整数坐标处。在移动过程中,纪念碑之间互不干扰。 将一座纪念碑从坐标 $a$ 移动至坐标 $b$ 的代价为 $|a-b|$。总代价定义为所有被移动纪念碑的代价之和。 你的任务是求出使所有纪念碑的建筑布局关于坐标 $0$ 对称的最小总代价;如果无法在给定约束下实现对称,则判定为无解。 ### 实现细节 你要实现以下函数: ```cpp long long get_cost(std::vector X, std::vector P) ``` - $X$:长度为 $N$ 的非递减数组,给出纪念碑的初始坐标。 - $P$:长度为 $M$ 的严格递增数组,给出古老纪念碑的编号。 - 对于每个测试用例,该函数恰好被调用一次。 该函数应返回一个整数:使建筑布局对称的最小总代价;如果不可能,则返回 $-1$。

输入格式

```text N M X[0] X[1] ... X[N-1] P[0] P[1] ... P[M-1] ``` 注意,如果 $M=0$,则第三行可能为空行。

输出格式

```text C ``` 其中,$C$ 为 `get_cost` 的返回值。

说明/提示

### 例子 #### 例 1 考虑以下调用: ```cpp get_cost([-3, -2, 1, 3], [1, 2]) ``` 纪念碑的初始建筑布局如下图所示。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/sx5yi3cs.png) ::: 共有 $N=4$ 座纪念碑,初始坐标分别为 $[-3,-2,1,3]$。古老纪念碑的编号为 $P[0]=1$ 和 $P[1]=2$。即坐标为 $X[P[0]]=-2$ 和 $X[P[1]]=1$ 的纪念碑不能移动。其余坐标为 $-3$ 和 $3$ 的纪念碑可以移动。 为使总代价最小且达到对称,我们需要如下移动纪念碑: - 将坐标为 $-3$ 的纪念碑移至 $-1$,代价为 $|(-3)-(-1)|=2$。 - 将坐标为 $3$ 的纪念碑移至 $2$,代价为 $|3-2|=1$。 移动后布局变为对称。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/9zyfsbcg.png) ::: 总移动代价为 $2+1=3$,因此该函数应返回 $3$。 #### 例 2 考虑以下调用: ```cpp get_cost([2, 2, 2, 3], []) ``` 此处 $M=0$,表示没有古老纪念碑,所有纪念碑均可移动。 一种最小总代价的解法是将所有纪念碑移至坐标 $0$。每座纪念碑的移动代价为: - 纪念碑 $0$、$1$ 和 $2$ 的代价为 $|2-0|=2$。 - 纪念碑 $3$ 的代价为 $|3-0|=3$。 总代价为 $2+2+2+3=9$。因此该函数应返回 $9$。注意,存在其他总代价相同的解法。 #### 例 3 考虑以下调用: ```cpp get_cost([1, 2, 3, 4], [0, 1, 2, 3]) ``` 全部 $4$ 座纪念碑均为古老纪念碑,无法移动。 由于它们的坐标均为正数,无法使建筑布局关于 $0$ 对称。 因此该函数应返回 $-1$。 ### 约束条件 - $1\le N\le 500\,000$ - $0\le M\le N$ - $-10^9\le X[0]\le X[1]\le\cdots\le X[N-1]\le 10^9$ - $0\le P[0]