CSA Round 84 Mahattan Center

题目

题目大意

给定平面上的 \(n\) 个点和常数 \(k\),求 \(x\) 轴上的点 \(p\)\(n\) 个点中距其最近的 \(k\) 个点的距离之和的最小值。两点之间的距离定义为曼哈顿距离。

数据范围

\(1\le k \le n \le 10^5\)

点的坐标是 \(1\)\(10^8\) 之间的整数。

可能有重合的点。

分析

A optimization problem can have many possible solutions. Each solution has a value, and we wish to find a solution with the optimal (minimum or maximum) value. We call such a solution an optimal solution, as opposed to the optimal solution, since there may be several solutions that achieve the optimal value.

对于这种类型的最优化问题(optimization problems),思考的大方向是「降低问题的自由度」。
具体地说,找决策空间 \(U\)(或者称之为「状态空间」)的一个子集 \(S\),使得 \(S\) 满足:

  • 可以在 \(S\) 中找到一个最优解
  • \(S\) 中元素较少,遍历 \(S\) 找最优解是可行的

如果已经选定 \(k\) 个点,要在 \(x\) 轴上找一点 \(p\) 使得 \(p\) 到这 \(k\) 个点的曼哈顿距离之和最小。这个问题相当于

给定 \(x\) 轴上的 \(k\) 个点,在 \(x\) 轴上找一点 \(p\) 使得 \(p\) 到这 \(k\) 个点的距离之和最小。

这是一个经典问题,解是这 \(k\) 的点的中位点(median)。奇数个点的中位点是中间的那个点,偶数个点的中位点是中间的两个点之间的线段上的任意一点(包括两端点)。

回到原问题,从上面的分析可以得到一个算法:枚举最优解中 \(k\) 个点的横坐标的中位点。

将给定的 \(n\) 个点构成的(可重)集合记做 \(P\)
注意到对于 \(n\) 个点中的任意 \(k\) 个点,必然存在点 \(p \in P\) 使得 \(p\) 的横坐标是选出的 \(k\) 个点的横标做的中位点。

所以我们只需要枚举点的横坐标即可。

\(n\) 个点按横坐标从小到大排序,依次记为 \(p_1, p_2, \dots, p_n\),设第 i 个点的坐标为 \((x_i , y_i)\)
令 $L_i $ 为 \(p_1, p_2, \dots, p_{i-1}\) 中距 \((x_i,0)\) 最近的 \(\lfloor n/2 \rfloor\) 个点与 \((x_i, 0)\) 的距离之和,\(R_i\) 表示 \(p_i, p_{i+1}, \dots, p_n\) 中距 \((x_i, 0)\) 最近 \((x_i, 0)\) 最近的 \(n - \lfloor n/2 \rfloor\) 个点与 \((x_i, 0)\) 的距离之和。

答案即 \(\min_{1\le i \le n} L_i + R_i\)

参考实现


### Observation I

\(p\)\(k\) 个最近点的距离之和一定可以在 \(p\) 的横坐标取为 \(n\) 个点中某个点的横坐标时取到。

### Observation II

posted @ 2018-07-20 16:02  Pat  阅读(214)  评论(0编辑  收藏  举报