[bzoj3170][切比雪夫距离]松鼠聚会

2023-10-16 03:48

本文主要是介绍[bzoj3170][切比雪夫距离]松鼠聚会,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1。现在N个松鼠要走到一个松鼠家去,求走过的最短距离。

Input

第一行给出数字N,表示有多少只小松鼠。0<=N<=10^5 下面N行,每行给出x,y表示其家的坐标。
-109<=x,y<=109

Output

表示为了聚会走的路程和最小为多少。

Sample Input

6

-4 -1

-1 -2

2 -4

0 2

0 3

5 -2

Sample Output

20

题解

题目要求切比雪夫距离
我们可以推一推

m a x ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) max(|x1-x2|,|y1-y2|) max(x1x2,y1y2)
∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ = m a x ( x 1 − x 2 + y 1 − y 2 , x 2 − x 1 + y 1 − y 2 , x 1 − x 2 + y 2 − y 1 , x 2 − x 1 + y 2 − y 1 ) |x1-x2|+|y1-y2|=max(x1-x2+y1-y2,x2-x1+y1-y2,x1-x2+y2-y1,x2-x1+y2-y1) x1x2+y1y2=max(x1x2+y1y2,x2x1+y1y2,x1x2+y2y1,x2x1+y2y1)
上面分别是切比雪夫距离和曼哈顿距离
我们设
X 1 = x 1 + y 1 X1=x1+y1 X1=x1+y1
X 2 = x 2 + y 2 X2=x2+y2 X2=x2+y2
Y 1 = x 1 − y 1 Y1=x1-y1 Y1=x1y1
Y 2 = x 2 − y 2 Y2=x2-y2 Y2=x2y2
那么可以化成
= m a x ( X 1 − X 2 , Y 2 − Y 1 , Y 1 − Y 2 , X 2 − X 1 ) = m a x ( ∣ X 1 − X 2 ∣ , ∣ Y 1 − Y 2 ∣ ) =max(X1-X2,Y2-Y1,Y1-Y2,X2-X1) =max(|X1-X2|,|Y1-Y2|) =max(X1X2,Y2Y1,Y1Y2,X2X1)=max(X1X2,Y1Y2)
于是(x1,y1),(x2,y2)的曼哈顿距离可以化成
(x1+y1,x1-y1),(x2+y2,x2-y2)的切比雪夫距离
反过来推的话,那么
x1+y1=X1,x1-y1=Y1
发现(x1,y1)=((X1+Y1)/2,(X1-Y1)/2)
那么(x1,y1),(x2,y2)的切比雪夫距离即为((x1+y1)/2,(x1-y1)/2)到((x2+y2)/2,(x2-y2)/2)的曼哈顿距离
同时乘2后答案扩大两倍,可以简化
问题转化为求一个点,使得其他点到他的曼哈顿距离最小
前缀和即可

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
struct node{LL x,y;int op;}w[110000];
bool cmpx(node n1,node n2){return n1.x<n2.x;}
bool cmpy(node n1,node n2){return n1.y<n2.y;}
LL s[110000],g[110000],ans[110000];
int n;
/*
max(|x1-x2|,|y1-y2|)
|x1-x2|+|y1-y2|=max(x1-x2+y1-y2,x2-x1+y1-y2,x1-x2+y2-y1,x2-x1+y2-y1)
X1=x1+y1
X2=x2+y2
Y1=x1-y1
Y2=x2-y2
=max(X1-X2,Y2-Y1,Y1-Y2,X2-X1)
=max(|X1-X2|,|Y1-Y2|)
*/
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){LL x,y;scanf("%lld%lld",&x,&y);w[i].x=(x+y);w[i].y=(x-y);w[i].op=i;}sort(w+1,w+1+n,cmpx);s[0]=0;for(int i=1;i<=n;i++)s[i]=s[i-1]+(w[i].x-w[i-1].x)*(i-1);g[n+1]=0;for(int i=n;i>=1;i--)g[i]=g[i+1]+(w[i+1].x-w[i].x)*(n-i);for(int i=1;i<=n;i++)ans[w[i].op]=s[i]+g[i];sort(w+1,w+1+n,cmpy);s[0]=0;for(int i=1;i<=n;i++)s[i]=s[i-1]+(w[i].y-w[i-1].y)*(i-1);g[n+1]=0;for(int i=n;i>=1;i--)g[i]=g[i+1]+(w[i+1].y-w[i].y)*(n-i);for(int i=1;i<=n;i++)ans[w[i].op]+=s[i]+g[i];LL maxx=1LL<<63-1;for(int i=1;i<=n;i++)maxx=min(maxx,ans[i]);printf("%lld\n",maxx/2);return 0;
}

这篇关于[bzoj3170][切比雪夫距离]松鼠聚会的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218817

相关文章

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

模拟退火求n个点到某点距离和最短

/*找出一个点使得这个店到n个点的最长距离最短,即求最小覆盖圆的半径用一个点往各个方向扩展,如果结果更优,则继续以当前步长扩展,否则缩小步长*/#include<stdio.h>#include<math.h>#include<string.h>const double pi = acos(-1.0);struct point {double x,y;}p[1010];int

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

SimD:基于相似度距离的小目标检测标签分配

摘要 https://arxiv.org/pdf/2407.02394 由于物体尺寸有限且信息不足,小物体检测正成为计算机视觉领域最具挑战性的任务之一。标签分配策略是影响物体检测精度的关键因素。尽管已经存在一些针对小物体的有效标签分配策略,但大多数策略都集中在降低对边界框的敏感性以增加正样本数量上,并且需要设置一些固定的超参数。然而,更多的正样本并不一定会带来更好的检测结果,事实上,过多的正样本

Matlab)实现HSV非等间隔量化--相似判断:欧式距离--输出图片-

%************************************************************************** %                                 图像检索——提取颜色特征 %HSV空间颜色直方图(将RGB空间转化为HS

C/C++两点坐标求距离以及C++保留两位小数输出,秒了

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 3. 备注 1. 前言 依旧是带来一个练手的题目,目的就一个,方法千千万,通向终点的方式有很多种,没有谁与谁,我们都是为了成为更好的自己。 2. 正文 2.1 问题 题目描述: 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。 输入格式:

mysql5.6根据经纬度查询距离二

在MySQL 5.6中,您可以使用Haversine公式来根据经纬度查询距离。以下是一个示例SQL查询,它计算出所有点与给定点(经度lon和纬度lat)的距离,并按距离排序: SELECT id, (2 * 6378.137 * ASIN(SQRT(POW( SIN( PI( ) * ( $lng- `long` ) / 360 ), 2 ) + COS( PI( ) * $lat / 180

像素间的关系(邻接、连通、区域、边界、距离定义)

文章目录 像素的相邻像素4邻域D邻域8邻域 邻接、连通、区域和边界邻接类型连通区域边界 距离测度欧氏距离城市街区距离(city-block distance)棋盘距离(chessboard distance) 参考 像素的相邻像素 4邻域 坐标 ( x , y ) (x,y) (x,y)处的像素 p p p有2个水平的相邻像素和2个垂直的相邻像素,它们的坐标是: ( x

【go语言计算两个经纬度距离】根据经纬度计算两点之间距离

一、需求分析: 输入两个经纬度,计算它们之间的距离 lat1,lng1 := 32.060255,118.796877lat2,lng2 := 39.904211,116.407395 二、计算公式 //C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)

【python 走进NLP】文本相似度各种距离计算

计算文本相似度有什么用? 1、反垃圾文本的捞取 “诚聘淘宝兼职”、“诚聘打字员”…这样的小广告满天飞,作为网站或者APP的运营者,不可能手动将所有的广告文本放入屏蔽名单里,挑几个典型广告文本,与它满足一定相似度就进行屏蔽。 2、推荐系统 在微博和各大BBS上,每一篇文章/帖子的下面都有一个推荐阅读,那就是根据一定算法计算出来的相似文章。 3、冗余过滤 我们每天接触过量的信息,信息之间存在大量