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