UOJ Logo Universal Online Judge

UOJ

#1110. 【IOI2026】纪念碑

附件下载 统计

撒马尔罕著名的雷吉斯坦广场内有 $N$ 座纪念碑,它们排列成一条穿过广场中心的直线。这些纪念碑的编号从 $0$ 到 $N-1$。编号为 $i$($0\le i < N$)的纪念碑初始位于整数坐标 $X[i]$ 处,广场中心位于坐标 $0$。

建筑师要求建筑布局关于中心完美对称。他们希望通过移动其中一些(数量可能为零)纪念碑,使得最终的建筑布局关于坐标 $0$ 对称,可以形式化描述如下:

  • 所有纪念碑必须位于整数坐标处。
  • 每个整数坐标可以放置零个、一个或多个纪念碑。
  • 对于任意整数 $x > 0$,位于坐标 $x$ 处的纪念碑数量必须等于位于坐标 $-x$ 处的纪念碑数量。坐标 $0$ 上可以放置任意数量的纪念碑(数量可能为零)。

然而,有 $M$ 座古老纪念碑年久失修导致无法移动。它们的编号为 $P[0],P[1],\ldots,P[M-1]$。这 $M$ 座纪念碑必须停留在其原始坐标上,其余 $N-M$ 座纪念碑可以移动到任意整数坐标处。在移动过程中,纪念碑之间互不干扰。

将一座纪念碑从坐标 $a$ 移动至坐标 $b$ 的代价为 $|a-b|$。总代价定义为所有被移动纪念碑的代价之和。

你的任务是求出使所有纪念碑的建筑布局关于坐标 $0$ 对称的最小总代价;如果无法在给定约束下实现对称,则判定为无解。

实现细节

你要实现以下函数:

long long get_cost(std::vector<int> X, std::vector<int> P);
  • $X$:长度为 $N$ 的非递减数组,给出纪念碑的初始坐标。
  • $P$:长度为 $M$ 的严格递增数组,给出古老纪念碑的编号。
  • 对于每个测试用例,该函数恰好被调用一次。
  • 该函数应返回一个整数:使建筑布局对称的最小总代价;如果不可能,则返回 $-1$。

约束条件

对于所有测试数据:

  • $1\le N\le 500000$;
  • $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] < P[1] < \cdots < P[M-1] < N$。

子任务

子任务 分数 额外的约束条件
$1$ $3$ $M=N$
$2$ $4$ $M=0$
$3$ $5$ 对于所有满足 $0\le j < M$ 的 $j$,均有 $X[P[j]] < 0$
$4$ $6$ $N\le 10$
$5$ $5$ $N\le 19$
$6$ $5$ $N\le 32$
$7$ $13$ $N\le 200$
$8$ $17$ $N\le 4000$
$9$ $13$ $M\le 4000$
$10$ $29$ 没有额外的约束条件

例子

例 1

考虑以下调用:

get_cost({-3, -2, 1, 3}, {1, 2})

纪念碑的初始建筑布局如下图所示。

共有 $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$。

移动后布局变为对称。

总移动代价为 $2+1=3$,因此该函数应返回 $3$。

例 2

考虑以下调用:

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

考虑以下调用:

get_cost({1, 2, 3, 4}, {0, 1, 2, 3})

全部 $4$ 座纪念碑均为古老纪念碑,无法移动。

由于它们的坐标均为正数,无法使建筑布局关于 $0$ 对称。

因此该函数应返回 $-1$。

评测程序示例

输入格式:

N M
X[0] X[1] ... X[N-1]
P[0] P[1] ... P[M-1]

注意,如果 $M=0$,则第三行可能为空行。

输出格式:

C

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

时间限制:$\texttt{1s}$

空间限制:$\texttt{2G}$