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}

:::
共有 $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}

:::
总移动代价为 $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]