曼哈顿距离与切比雪夫距离的亲密♂关系。

先来看一下曼哈顿距离和切比雪夫距离的定义。(以下我可能用\(D_m,D_q\)来表示两者)

曼哈顿距离:\(|x_1-x_2|+|y_1-y_2|\)

切比雪夫距离:\(max(|x_1-x_2|,|y_1-y_2|)\)

至于为什么说他俩关系♂,就是因为他们可以相互转化!

转换关系如下:当坐标为\((x,y)\)时

\(D_m=\)坐标为\((x+y,x-y)\)时的\(D_q\)

\(D_q=\)坐标为\((\dfrac{x+y}{2},\dfrac{x-y}{2})\)时的\(D_q\)

经过向\(Itst\)神仙询问,将其区分开来:

\(D_m\)常用于求和,而\(D_q\)常用于\(max,min\)

而其中的绝对值,可以用排序去掉。

\(LuoguP2906Cow Neighborhoods\)

做法:现将曼哈顿距离转化为切比雪夫,排序,枚举每个点,删掉\(x\)的差已经大于\(C\)的点。

再用\(set\)维护新\(y_i\)(及点的编号),找到第一个满足条件的点后就加群,在判断前一个是否满足,加群。

群的关系用并查集维护就好了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
    int f=1,w=0;char x=0;
    while(x<'0'||x>'9') {if(x=='-') f=-1; x=getchar();}
    while(x!=EOF&&x>='0'&&x<='9') {w=(w<<3)+(w<<1)+(x^48);x=getchar();}
    return w*f;
}
const int N=100010;
int n,fa[N],C,l=1,cnt[N],ansx,ans;
pair<int,int> p[N];
set<pair<int,int> > s;
inline int Find(int x) {return fa[x]==x?x:fa[x]=Find(fa[x]);}
main(){
#ifndef ONLINE_JUDGE
    freopen("A.in","r",stdin);
#endif
    n=read(); C=read();
    for(int i=1,x,y;i<=n;i++)
        x=read(),y=read(),p[i]=make_pair(x+y,x-y),fa[i]=i;
    sort(p+1,p+n+1);s.insert(make_pair(p[1].second,1));
    s.insert(make_pair(-1LL<<60,0)),s.insert(make_pair(1LL<<60,0));
    for(int i=2;i<=n;i++)
    {
        while(p[i].first-p[l].first>C) s.erase(make_pair(p[l].second,l)),l++;
        set<pair<int,int> >::iterator it=s.lower_bound(make_pair(p[i].second,0));
        if(it->first-p[i].second<=C) fa[Find(i)]=Find(it->second);it--;
        if(p[i].second-it->first<=C) fa[Find(i)]=Find(it->second);
        s.insert(make_pair(p[i].second,i));
    }
    for(int i=1;i<=n;i++) {cnt[Find(i)]++;if(Find(i)==i) ans++;}
    for(int i=1;i<=n;i++) ansx=max(ansx,cnt[i]);
    printf("%lld %lld",ans,ansx);
}

\(Luogu[TJOI2013]\)松鼠聚会

做法:将切比雪夫转曼哈顿,推公式,枚举聚会地点即可(当然还要排序

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
    int f=1,w=0;char x=0;
    while(x<'0'||x>'9') {if(x=='-') f=-1; x=getchar();}
    while(x!=EOF&&x>='0'&&x<='9') {w=(w<<3)+(w<<1)+(x^48);x=getchar();}
    return w*f;
}
const int N=100010;
int n,x[N],y[N],ans=1LL<<62,Sx[N],Sy[N],px[N],py[N];
main(){
#ifndef ONLINE_JUDGE
    //freopen("A.in","r",stdin);//Ans=20
    freopen("B.in","r",stdin);//Ans=15
#endif
    n=read();
    for(int i=1,X,Y;i<=n;i++) X=read(),Y=read(),x[i]=px[i]=X+Y,y[i]=py[i]=X-Y;
    sort(x+1,x+n+1);sort(y+1,y+n+1);
    for(int i=1;i<=n;i++) Sx[i]=x[i]+Sx[i-1],Sy[i]=y[i]+Sy[i-1];
    for(int i=1;i<=n;i++)
    {
        int sum=0,j=lower_bound(x+1,x+n+1,px[i])-x;
        sum+=j*px[i]-Sx[j]+Sx[n]-Sx[j]-(n-j)*px[i];
        j=lower_bound(y+1,y+n+1,py[i])-y;
        sum+=j*py[i]-Sy[j]+Sy[n]-Sy[j]-(n-j)*py[i];ans=min(ans,sum);
    }
    printf("%lld",ans/2);
}

原文地址:https://www.cnblogs.com/wo-shi-zhen-de-cai/p/11184197.html

时间: 2024-10-13 08:26:54

曼哈顿距离与切比雪夫距离的亲密♂关系。的相关文章

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] +

各种距离 欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准欧氏距离、马氏距离、余弦距离、汉明距离、杰拉德距离、相关距离、信息熵

1. 欧氏距离(Euclidean Distance) 欧氏距离是最容易直观理解的距离度量方法,我们小学.初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离. 二维平面上点a(x1,y1)与b(x2,y2)间的欧氏距离: 三维空间点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离: n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的欧氏距离(两个n维向量): Matlab计算欧氏距离: Matlab计算距离使用pdist函数.若X是一个m×n的矩阵,

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

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

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

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

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需要知道一些相邻物品的“

BZOJ 1516 [POI2006]Mag-Warehouse 切比雪夫距离转曼哈顿距离

题意: 给定一个网格图,其上有一堆坏点(整点,同一位置多个),求一个整点,使得该整点到所有的坏点的切比雪夫距离之和最小. 求这个整点位置. 无SPJ 解析: 看完题懵了,我只会曼哈顿距离啊怎么办. 然后就无聊查了下给定的那个计算公式,哇塞这居然叫切比雪夫距离. 噫怎么有个链接是谈切比雪夫转化曼哈顿距离的. 噫看完后我就会这道题辣! 对于原坐标系中两点间的 Chebyshev 距离,是将坐标轴顺(逆)时针旋转45度并将所有点的坐标值放大sqrt(2)倍所得到的新坐标系中的Manhattan距离的二

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