首页 > 其他分享 >切比雪夫距离小记

切比雪夫距离小记

时间:2023-02-21 15:00:17浏览次数:43  
标签:x1 比雪夫 距离 x2 y1 y2 小记

要不是做 JOI 我还不知道有这个东西。

定义

我们知道曼哈顿距离。假如点 \(a\) 坐标为 \((x1, y1)\),点 \(b\) 坐标为 \(x2, y2\),那么他们的曼哈顿距离为:\(|x1 - x2|+|y1-y2|\)。

现在我们看到切比雪夫距离的定义。如果你会玩国际象棋,你可以把点 \(a\) 与点 \(b\) 切比雪夫距离理解为国际象棋中的王从 \(a\) 走到 \(b\) 的最小步数。王每一步可以走一格,同时不仅能走上下左右,还能走斜线。

假如点 \(a\) 坐标为 \((x1, y1)\),点 \(b\) 坐标为 \(x2, y2\),那么他们的切比雪夫距离为:\(max(|x1 - x2|,|y1-y2|)\)。

证明:如果王从 \((x1,y1)\) 出发,没有到 \(x2\) 这一列,同时没有到 \(y2\) 这一行,那么它就能走斜线,从而将路程减少 \(1\) 。这样最多能走到横或竖到达终点,剩下的只能走直线。于是不难得出上式。

平心而论我觉得这个定义十分的扯淡,为什么会有人用国际象棋里棋子的走法定义距离呢。。。但国际象棋确实好玩

转化

这个东西和曼哈顿距离肯定有说不清道不明的关系!

我们令 \(d(a, b)\) 为 \(a\) 与 \(b\) 的曼哈顿距离,\(c(a, b)\) 为 \(a\) 与 \(b\) 的切比雪夫距离。

那么有:$d(a, b) = \(|x1 - x2|+|y1-y2| = max(x1-x2+y1-y2,x2-x1+y1-y2,x1-x2+y2-y1,x2-x1+y2-y1)\)。实际上是把绝对值的所有情况列出,最大的一项为两个非负数相加,即原绝对值之和。

所以 \(d(a,b)=max(|(x1+y1)-(x2+y2)|, |(x1-y1)-(x2-y2)|)\) 发现这个东西就是切比雪夫距离的定义。然后我们得出了曼哈顿距离与切比雪夫距离的关系:

将原坐标系的每一个点 \((x,y)\) 转为 \((x+y, x-y)\) 此时新坐标系中的切比雪夫距离等于原坐标系的曼哈顿距离。

你想把他反过来也是可以的:

将原坐标系的每一个点 \((x,y)\) 转为 \((\frac{x+y}{2}, \frac{x-y}{2})\) 此时新坐标系中的曼哈顿距离等于原坐标系的切比雪夫距离。

应用

切比雪夫距离相比与曼哈顿距离多了个 max ,对多个切比雪夫距离求和时很难受。如果把切比雪夫距离转成曼哈顿距离就有可能能用排序优化掉绝对值进行求解了。

有这种直接转移的憨批题:[TJOI2013]松鼠聚会

直接把切比雪夫距离转为曼哈顿距离后前缀和求解就行。

那有人就要说了:那我学这个东西有个 * 用?

目前为止好像确实是这样,但你先别急。

看看这篇文章的写作起点: [JOISC 2021 Day2] 道路の建設案

尽管切比雪夫距离求和很无力,但是因为 max 的存在,比大小却是一等一的。这道题就是个很好的例子。

我们二分第 \(k\) 小的距离,判断比他小的有多少个。

把曼哈顿距离转为切比雪夫距离后,判断大小就变成了二维数点问题了。这道题用 set 一个一个跳,每次二分最多跳 \(k\) 次,所以复杂度为 \(O(n \log k)\)。

#include <bits/stdc++.h>
#define ll long long
#define inf 2147483647
#define forp(i, a, b) for(ll i = (a);i <= (b);i ++)
using namespace std;
bool chkmin(ll &a, ll b) {return (b < a ? a = b, true : false);}
bool chkmax(ll &a, ll b) {return (b > a ? a = b, true : false);}
const ll maxn = 3e5 + 5;
ll n, k;
struct point{ 
	ll x, y;ll id; 
	bool operator <(const point &p) const{
		return p.y > y || (p.y == y && p.x > x);
	}
}city[maxn];
void change(point &p){
	int x = p.x, y = p.y;
	p = point{x + y, x - y, 0};
}
ll ans[maxn];
ll cnt = 0;
bool cmp(point a, point b){ return a.x < b.x; }
bool check(ll dis){
	cnt = 0;
	set<point> s;queue<point> q;
	forp(i, 1, n){
		while(!q.empty() && city[i].x - q.front().x > dis) s.erase(q.front()), q.pop();
		set<point>::iterator it = s.lower_bound(point{-inf, city[i].y - dis, 0});
		while(it != s.end() && abs((*it).y - city[i].y) <= dis){
			ans[++ cnt] = max(abs((*it).x - city[i].x), abs((*it).y - city[i].y));
			if(cnt == k) return true;
			it ++;
		}
		q.push(city[i]);
		s.insert(city[i]);
	}
	return false;
}
signed main()
{
	freopen("text.in", "r", stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n >> k;
	set<point> s;
	forp(i, 1, n) cin >> city[i].x >> city[i].y;
	forp(i, 1, n) change(city[i]);
	forp(i, 1, n) s.insert(city[i]);
	set<point>::iterator it = s.begin();
	sort(city + 1, city + n + 1, cmp);
	ll l = 1, r = 4e9 + 1;
	ll fin = 0;
	while(l <= r){
		ll mid = l + r >> 1;
		if(check(mid)) fin = mid, r = mid - 1;
		else l = mid + 1;
	}
	check(fin - 1);
	sort(ans + 1, ans + cnt + 1);
	forp(i, 1, cnt) cout << ans[i] << endl;
	forp(i, cnt + 1, k) cout << fin << endl;
	return 0;
}

标签:x1,比雪夫,距离,x2,y1,y2,小记
From: https://www.cnblogs.com/closureshop/p/17141025.html

相关文章

  • 数据结构刷题2023.02.21小记
    在图G的最小生成树G1中,可能会有某条边的权值超过未选边的权值.正确链接:在图G的最小生成树G1中,可能会有某条边的权值超过未选边的权值.prim是贪婪算法,每次找到一个......
  • 单位根反演小记
    显然我还不会这个,但是我先写点,写到啥算啥。单位根反演的式子。\([n|a]=\frac{1}n\sum\limits_{k=0}^{n-1}\omega^{ak}_n\)证明:$a\not=0$时,\(=\frac1n\sum......
  • 数据结构刷题2023.02.20小记
    排序算法最坏时间复杂度A:归并排序,是稳定排序,需要一个栈来维护,利用分治法思想每次分成两边分别排序再合并,具有稳定性,无论何时,其时间复杂度均为O(NlogN).B:快速排序,最坏情......
  • 根据两点经纬度计算两点间距离 js
    getDistance(lat1,lng1,lat2,lng2){letradLat1=lat1*Math.PI/180.0;letradLat2=lat2*Math.PI/180......
  • k8s 小记
    一、Pod常见状态Unschedulablepod不能被调度,kube-scheduler没有匹配到合适的node节点PodScheduledpod正处于调度中,在kube-scheduler刚开始调度的时候,还没有将pod......
  • 测量距离(中心线到中心线)
    doubleDis_lineLine(tag_tObj1,tag_tObj2)//测量距离{ NXOpen::Session*theSession=NXOpen::Session::GetSession(); NXOpen::Part*workPart(theSession->Parts()-......
  • 测量距离(面到面)
    doubleDis_faceFaec(tag_tObj1,tag_tObj2)//测量距离{ NXOpen::Session*theSession=NXOpen::Session::GetSession(); NXOpen::Part*workPart(theSession->Parts()-......
  • 数据结构刷题2023.02.18小记
    连通分量一个无向图的连通分量是其极大的连通子图无向图中任意两个节点之间有连通,则称为连通图。每一个非连通图可分为几个极大连通部分,每一个极大连通子图称为连通分量;......
  • 思科默认的管理距离
    2023-02-18路由选择协议   默认管理距离直连路由   0指向接口的静态路由   0指向下一条的静态路由   1EIGRP汇总路由   5外部BGP   20内部EIGRP......
  • 数据结构刷题2023.02.16小记
    Hash函数冲突处理方式开放定址法再哈希法链地址法设置公共溢出区法不论线性表采用顺序存储结构还是链式存储结构,删除值为X的结点的时间复杂度均为O(n)。正确顺序......