HDU 4311,4312 Meeting point(曼哈顿距离,切比雪夫距离)



题意: 面上n个点,某点到其他点的曼哈顿距离最小和,切比雪夫距离最小和。

思路:对于切比雪夫距离可以转化为哈密顿距离,方法是将每个点的坐标逆时针旋转45度然后放大sqrt(2)倍,换成坐标表示也就是(x,y)->(x-y,x+y).

对于第一个问题,求曼哈顿距离最小和,也就是sum(xj-xi)+sum(yj-yi)。

如果直接求时间复杂度无法承受。

所以我们可以先对x排序,对于从左到右的sum(x)我们可以递推出来,即sumx[tj[i].id] = sumx[tj[i-1].id] + (2*i-n)*(tj[i].x-tj[i-1].x);

对于y同理。

附4312代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
#define pii pair<int,int>
using namespace std;  

const int maxn = 100000 + 500;
//const int INF = 0x3f3f3f3f;
LL disx[maxn], disy[maxn];
LL sumv[maxn];
struct Point {
	int x, y, id;
	Point(int x=0, int y=0, int z=0) : x(x), y(y), id(z) {
	}
} tj[maxn];
bool cmp1(Point A, Point B) {
	return A.x < B.x;
}
bool cmp2(Point A, Point B) {
	return A.y < B.y;
}

int main() {
//	freopen("input.txt", "r", stdin);
	int t; cin >> t;
	while(t--) {
		int n;
		cin >> n;
		for(int i = 0; i < n; i++) {
			int u, v;
			scanf("%d%d", &u, &v);
			tj[i] = Point(u-v, u+v, i);
		}
		sort(tj, tj+n, cmp1);
		disx[tj[0].id] = 0;
		for(int i = 1; i < n; i++) disx[tj[0].id] += (LL)tj[i].x - (LL)tj[0].x;
		for(int i = 1; i < n; i++) disx[tj[i].id] = disx[tj[i-1].id] + (LL)(2*i-n)*(LL)(tj[i].x-tj[i-1].x);
		sort(tj, tj+n, cmp2);
		disy[tj[0].id] = 0;
		for(int i = 1; i < n; i++) disy[tj[0].id] += (LL)tj[i].y - (LL)tj[0].y;
		for(int i = 1; i < n; i++) disy[tj[i].id] = disy[tj[i-1].id] + (LL)(2*i-n)*(LL)(tj[i].y-tj[i-1].y);
		LL ans = 100000000000000000;
		for(int i = 0; i < n; i++) {
			sumv[i] = disx[i] + disy[i];
		//	cout << disx[i] << " " << disy[i] << endl;
			ans = min(ans, sumv[i]);
		}
		cout << ans/2 << endl;
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-10 00:28:07

HDU 4311,4312 Meeting point(曼哈顿距离,切比雪夫距离)的相关文章

HDU 4311&amp;4312 Meeting point-1&amp;2 (曼哈顿距离&amp;&amp;切比雪夫距离)

HDU 4311 题意:平面上有n个点,一个点(x,y)只能到达(x-1,y), (x+1,y), (x, y-1), (x, y+1)4个点.从n个点中找到一点,使其他点到此点的距离之和最小. 思路: 可以发现,两个点间距离为 |x1-x2| + |y1-y2| ,这便是两点间的曼哈顿距离. 朴素的做法是遍历所有点,枚举该点与其他点间的曼哈顿距离之和,但是会TLE: 取巧的做法是将所有点与中心点的曼哈顿距离排序,枚举中间大概250个点左右的情况比较即可(不要欺负人家数据水! 正确姿势: 用结构

bzoj 3170 Tjoi 2013 松鼠聚会 曼哈顿距离&amp;&amp;切比雪夫距离

因为曼哈顿距离很好求,所以要把每个点的坐标转换一下. 转自:http://blog.csdn.net/slongle_amazing/article/details/50911504 题解 两个点的切比雪夫距离为d=max(|x1?x2|,|y1?y2|)   写一下曼哈顿距离的常用处理方法 两个点(x1,y2),(x2,y2) 其曼哈顿距离=|x1?x2|+|y1?y2| 因为|x1?x2|=max(x1?x2,x2?x1) 所以可以写成=max(x1?x2+y1?y2,x1?x2+y2?y1

生命(哈密尔顿距离&amp;切比雪夫距离+前缀和)

数据 题目大意: 已经很简洁了 题解: 对于每个询问,暴力枚举老蛤的位置,\(O(1)\) 统计答案 那么对着原图斜着维护前缀和就行了 或者将曼哈顿距离转换成切比雪夫距离 统计正方形区域前缀和 注意方案中枚举的老蛤的位置要再原图内 AC代码 #include <cstdio> #include <algorithm> using namespace std; const int N=2e3+5; int n,K,Q,s,ans; int a[N][N]; inline int re

【HDU 4311】Meeting point-1(前缀和求曼哈顿距离和)

题目链接 正经解法: 给定n个点的坐标,找一个点,到其他点的曼哈顿距离之和最小.n可以是100000.大概要一个O(nlogn)的算法.算欧几里得距离可以把x和y分开计算排好序后计算前缀和就可以在O(1)时间内判断一个点到其他点的距离. #include<cstdio> #include<algorithm> using namespace std; #define ll long long #define N 100005 int t,n; ll ans,sum[N],sx[N]

HDU 4312 最小切比雪夫距离-转化成曼哈顿距离再分治

题意:二维空间,n个点,求以某点为起点到各点的最小切比雪夫距离 分析: 上一道题之前已经用"分治"思想在O(n)的时间内求出了n个点,以某点为起点到各点的最小曼哈顿距离,那么我们根据二维空间切比雪夫距离和曼哈顿距离的关系,可以把切比雪夫距离转化成曼哈顿距离,再直接用之前的方法即可. 二维空间: 曼哈顿距离 :d=|x1-x2|+|y1-y2|,到某点的曼哈顿距离为r的点组成一个边长为√2*r的正方形,且边与坐标轴成45度 切比雪夫距离:d=max(|x1-x2|,|y1-y2|),到某

HDU 4311 Meeting point-1 &amp;&amp; HDU 4312 Meeting point-2

这俩个题  题意::给出N(<1e5)个点求找到一个点作为聚会的地方,使每个点到达这里的距离最小.4311是 曼哈顿距离 4312是 切比雪夫距离: 曼哈顿距离 :大家都知道 对于二维坐标系a(xa,yb),b(xb,yb)的曼哈顿距离是abs(xa-xb)+abs(ya-yb): 看的出来这个距离和x,y 都有关,但是X,Y并不相互影响,所以可以分开计算这样,分开计算的好处如下: 如果 只给一个维度的坐标系 ,我们是不可以再什么养的复杂度的时间内处理出来呢? 大难还是很好想的先排序一下,会发现

Hdu 4312-Meeting point-2 切比雪夫距离,曼哈顿距离,前缀和

题目: http://acm.hdu.edu.cn/showproblem.php?pid=4312 Meeting point-2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1231    Accepted Submission(s): 691 Problem Description It has been ten years s

HDU4312 Meeting point-2 (切比雪夫距离&amp;&amp;曼哈顿距离)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4312 题意:给定平面坐标上n(n<=100000)个点,然后在其中选一个,使得所有点到当前点的Chebyshev距离和最小. 分析: 切比雪夫距离:设a(x1,y1),b(x2,y2);DIS = max(|x1-x2|,|y1-y2|) = (|x1-x2+y1-y2|+|x1-x2-y1+y2|)/2; 我们将点aa的坐标看成(x1+y1,x1-y1),bb的坐标看成(x2+y2,x2-y2)

BZOJ 2735: 世博会 主席树+切比雪夫距离转曼哈顿距离

2735: 世博会 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 51[Submit][Status][Discuss] Description 四年一度的世博会又要举办了,Q国很荣幸成为了这次世博会的主办方.Q国主席QQ从全国各地收集了N件物品排成 一排,作为Q国馆的展出物.对于相邻摆放的一些物品,如果过于相似会让人觉得无聊,如果差别过大又会让人觉 得突兀.为了让人们对这次世博会的展出满意,QQ需要知道一些相邻物品的“