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

  因为曼哈顿距离很好求,所以要把每个点的坐标转换一下。

  转自: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,x2?x1+y1?y2,x2?x1+y2?y1)

  =max((x1+y1)?(x2+y2),(x1?y1)?(x2?y2),?(x1?y1)+(x2?y2),?(x1+y1)+(x2+y2))

  =max(|(x1+y1)?(x2+y2)|,|(x1?y1)?(x2?y2)|)

  令x′=x+y,y′=x?y=max(|x′1?x′2|,|y′1?y′2|)

  这样曼哈顿距离就被转化为了切比雪夫距离
  同理,我们把切比雪夫距离转化为曼哈顿距离(x,y)=(x+y2,x?y2)
  就转化为了n?1个点到一个点的曼哈顿距离最小
  计算曼哈顿距离x和y分开计算即可

  

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #define ll long long
 6 #define N 100005
 7 using namespace std;
 8 int n;
 9 struct node
10 {
11     int x,y,id;
12     friend bool operator < (node aa,node bb)
13     {
14         return aa.x<bb.x;
15     }
16 }a[100005];
17 ll ans[N],sum[N];
18 bool cmp(node aa,node bb)
19 {
20     return aa.y<bb.y;
21 }
22 int main()
23 {
24     scanf("%d",&n);int t1,t2;
25     for(int i=1;i<=n;i++)
26     {
27         scanf("%d%d",&t1,&t2);
28         a[i].x=t1+t2;a[i].y=t1-t2;a[i].id=i;
29     }
30     sort(a+1,a+n+1);
31     for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i].x;
32     for(int i=1;i<=n;i++)
33     {
34         ans[a[i].id]+=(ll)a[i].x*(i-1)-sum[i-1];
35         ans[a[i].id]+=(sum[n]-sum[i])-((ll)a[i].x*(n-i));
36     }
37     sort(a+1,a+n+1,cmp);
38     for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i].y;
39     for(int i=1;i<=n;i++)
40     {
41         ans[a[i].id]+=(ll)a[i].y*(i-1)-sum[i-1];
42         ans[a[i].id]+=(sum[n]-sum[i])-((ll)a[i].y*(n-i));
43     }
44     ll mx=1ll<<62;
45     for(int i=1;i<=n;i++)mx=min(mx,ans[i]);
46     printf("%lld\n",mx/2);
47     return 0;
48 }
时间: 2024-12-24 23:42:51

bzoj 3170 Tjoi 2013 松鼠聚会 曼哈顿距离&&切比雪夫距离的相关文章

BZOJ 3170: [Tjoi 2013]松鼠聚会( sort )

题目的距离为max(|x1-x2|, |y1-y2|) (切比雪夫距离). 切比雪夫距离(x, y)->曼哈顿距离((x+y)/2, (x-y)/2) (曼哈顿(x, y)->切比雪夫(x+y, x-y)). 转成Manhattan distance后排序前缀和维护即可. -------------------------------------------------------------------------- #include<cstdio> #include<cs

BZOJ 3170 TJOI 2013 松鼠聚会 切比雪夫距离

题目大意:给出平面上的一些点,求这些点中的一个使得所有点到这个点的切比雪夫距离之和最短. 思路:切比雪夫距离和曼哈顿距离是可以相互转化的,具体实现就是吧一个点的坐标由(x,y)变成(x - y,x + y),求切比雪夫距离就可以转化成求曼哈顿距离了,很好推. 然后就是暴力枚举每一个点,统计出来每个点的曼哈顿距离之和,最后取一个最小值. CODE: #include <cstdio> #include <cstring> #include <iostream> #incl

BZOJ 3170 [Tjoi 2013]松鼠聚会

题目描述 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. 输入 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5下面N行,每行给出x,y表示其家的坐标.-10^9<=x,y<=10^9 输出 表示为了聚会走的路程和最小为多少. 样例输入 6 -4 -1 -1 -2 2 -4 0 2 0 3 5 -2 样例输出 20 解题思路 新学了一个姿

BZOJ 3170 Tjoi 2013 松鼠聚会 计算几何

题目大意:给定平面上的n个点,求这n个点中的一个点到这n个点的切比雪夫距离之和最小 切比雪夫距离,即各坐标差绝对值的最大值 首先我们如果想把曼哈顿距离转化成切比雪夫距离 那么就要把点(x,y)变成(x+y,x-y) 这样新点之间的切比雪夫距离就是原点之间的曼哈顿距离 同理,我们可以把切比雪夫距离转化成曼哈顿距离 即把点(x,y)变成((x+y)/2,(x-y)/2) 然后将横纵坐标排序 维护前缀和 分开讨论横纵坐标的曼哈顿距离即可 避免double,最后算出距离再除以2 #include <cm

bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)

题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5下面N行,每行给出x,y表示其家的坐标.-10^9<=x,y<=10^

3170: [Tjoi 2013]松鼠聚会

3170: [Tjoi 2013]松鼠聚会 Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5下面N行,每行给出x,y表示其家的坐标.-10^9<=x,y<=10^9 Output 表示为了聚会走的路程和最小为多少. Sample Input 6 -4 -1

【BZOJ3170】[Tjoi 2013]松鼠聚会 旋转坐标系

[BZOJ3170][Tjoi 2013]松鼠聚会 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5下面N行,每行给出x,y表示其家的坐标.-10^9<=x,y<=10^9 Output 表示为了聚会走的路程和最小为多少. Sample Input 6 -4 -1 -1 -2 2

bzoj3170 [Tjoi 2013]松鼠聚会

Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5 下面N行,每行给出x,y表示其家的坐标. -10^9<=x,y<=10^9 Output 表示为了聚会走的路程和最小为多少. 首先等价变换,旋转坐标系45度,将点(x,y)改为((x+y)/2,(x-y)/

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个点左右的情况比较即可(不要欺负人家数据水! 正确姿势: 用结构