P3964 [TJOI2013]松鼠聚会


给定n个点,求出一个点使得其他点到该点的切比雪夫距离和最小,输出这个答案。

切比雪夫距离是取max的,不好计算。我们可以转化成曼哈顿距离,然后求和。对x,y两个坐标分开计算距离。

曼哈顿距离是绝对值,要分类讨论,然后用前缀和优化下即可

const int N = 1e5 + 79;
lxl ans(1e18);
int n;
lxl x[N], y[N];
lxl sx[N], sy[N];
struct point {
	lxl x, y;
} p[N];

int main() {
	read(n);
	rep(i, 1, n) {
		int a,b;
		read(a);
		read(b);
		x[i] = p[i].x = a+b;
		y[i] = p[i].y = a-b;
	}
	
	
	std::sort(x + 1, x + n + 1);
	std::sort(y + 1, y + n + 1);

	rep(i, 1, n) {
		sx[i] = sx[i - 1] + x[i];
		sy[i] = sy[i - 1] + y[i];
	}


	rep(i, 1, n) {
		lxl posx = std::lower_bound(x + 1, x + n + 1, p[i].x) - x;
		lxl posy = std::lower_bound(y + 1, y + n + 1, p[i].y) - y;

		lxl temp(0);
		temp += posx * p[i].x - sx[posx] + (sx[n] - sx[posx]) - (n - posx) * p[i].x;
		temp += posy * p[i].y - sy[posy] + (sy[n] - sy[posy]) - (n - posy) * p[i].y;

		ans = min(ans, temp);
	}
	out(ans >> 1, '\n');
	return 0;
}