解题思路
曼哈顿距离可以把横、纵两个方向拆开,本题等价于分别在数轴上选 P 和 Q,使加权一维距离和最小,再用加权中位数求出这两个坐标。
- 工厂落在 (P,Q) 时,总路程为 ∑wi∣ai−P∣+∑wi∣bi−Q∣。前一项只与 P 有关,后一项只与 Q 有关,可以分开最小化。
- 一维上,点 zi 带权 wi,使 ∑wi∣zi−x∣ 最小的 x 就是加权中位数:把点按坐标排序后从左往右累加权重,第一次让前缀权重至少达到总权重一半的那个坐标即可。总权重为偶数时,两个中间位置之间的任意点代价相同,取先达到一半的那个即可。
- 对横坐标序列 (ai,wi) 求加权中位数得到 P,对纵坐标序列 (bi,wi) 同样得到 Q。
- 把 (P,Q) 代回原式,累加每个居民区的加权曼哈顿距离。坐标与人数都较大,求和时用 64 位整数。
题目内容
现在要在二维平面上选定一个工厂落点 (P,Q),目标是让所有居民走到工厂的加权曼哈顿距离之和尽可能小。请输出这个最小值。
该地区共有 m 个居民区。第 i 个居民区位于 (ai,bi),住有 wi 名居民。
两点之间的路程按曼哈顿距离计算:(s,t) 到 (u,v) 为 ∣s−u∣+∣t−v∣。第 i 个居民区对工厂的加权曼哈顿距离为
wi×(∣ai−P∣+∣bi−Q∣)
解答要求:
- 时间限制:C/C++ 100ms,其他语言:200ms
- 内存限制:C/C++ 256MB,其他语言:512MB
输入描述
第一行一个整数 m(1≤m≤10000),表示居民区个数。
接下来 m 行,每行三个整数 ai、bi、wi(−109≤ai,bi≤109,1≤wi≤106),表示第 i 个居民区的坐标和居民人数。
输出描述
输出一个整数,表示最小的加权曼哈顿距离之和。
样例1
输入
3
0 3 2
5 3 4
5 7 1
输出
14
说明
把工厂建在 (5,3) 时:
- 到 (0,3) 的距离是 ∣0−5∣+∣3−3∣=5,人数 2,贡献 5×2=10
- 到 (5,3) 的距离是 0,人数 4,贡献 0
- 到 (5,7) 的距离是 ∣5−5∣+∣7−3∣=4,人数 1,贡献 4
- 总和为 10+0+4=14,这就是最小的加权曼哈顿距离之和
样例2
输入
3
0 1 1
4 1 1
2 6 1
输出
9
说明
把工厂建在 (2,1) 时:
- 到 (0,1) 的距离是 2,贡献 2
- 到 (4,1) 的距离是 2,贡献 2
- 到 (2,6) 的距离是 5,贡献 5
- 总和为 2+2+5=9,这就是最小的加权曼哈顿距离之和