[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

相关文章

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i

今天遇到的3到智力面试题(给工人分金条,小鸟来回在2火车之间飞行的距离,精确称水问题)

智力题1:你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你的工人付费? 答:把金条2次弄断的方式是第一次1,6分,,然后把剩余的6用2,4分,即弄断2次为1段、2段、4段 第一天给1段, 第二天让工人把1段归还给2段, 第三天给1段, 第四天归还1段和2段,给4段。 第五天给1段, 第六天给2

计算两个字符串的距离(递归搜索会爆栈)

/*很经典的可使用动态规划方法解决的题目,和计算两字符串的最长公共子序列相似。设Ai为字符串A(a1a2a3 … am)的前i个字符(即为a1,a2,a3 … ai)设Bj为字符串B(b1b2b3 … bn)的前j个字符(即为b1,b2,b3 … bj)设 L(i,j)为使两个字符串和Ai和Bj相等的最小操作次数。当ai==bj时 显然 L(i,j) = L(i-1,j-1)当ai!=

什么是距离选通型水下三维激光扫描仪?(下)

距离选通激光水下成像的发展 距离选通激光成像技术始于上世纪60年代,受制于高性能脉冲激光器和选通成像器件发展的制约,激光距离选通成像技术在随后的二十年发展缓慢,直到20世纪90年代,随着硬件技术的不断成熟,该技术才得到迅速发展。 2016年黄子恒对水下三维成像技术总结为:基于条纹管的激光雷达系统的线扫描成像、多角度拍摄三维成像、点扫描三维成像技术以及基于距离选通成像系统的单帧三维成像和基于距离

AI大模型日报#0622:Claude 3.5 Sonnet超越GPT-4o、盘古大模型跳级发布、松鼠AI多模态教育大模型

导读:AI大模型日报,爬虫+LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE-4.0-8K-latest)生成了今日要点以及每条资讯的摘要。欢迎阅读!《AI大模型日报》今日要点:中科大与上海AI Lab等团队发布了高质量视频数据集ShareGPT4Video,通过GPT-4v的视觉能力实现视频的高质量描述,对视频理解和生成任务有着重要意义。同时,OpenAI收购数据

网页卷去的距离与偏移量的问题探讨

网页卷去的距离与偏移量 方便直观下面有一张图: scrollLeft:设置或获取位于给定对象左边界与窗口中目前可见内容的最左端之间的距离 ,即左边灰色的内容。 scrollTop:设置或获取位于对象最顶端与窗口中可见内容的最顶端之间的距离 ,即上边灰色的内容。 offsetLeft:获取指定对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置 。

聚类算法(1)---最大最小距离、C-均值算法

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记:       AI学习笔记(7)---《聚类算法(1)---最大最小距离、C-均值算法》 聚类算法(1)---最大最小距离、C-均值算法 目录 一、聚类算法背景知识

多目标跟踪 距离的可视化(有动图)

多目标跟踪 距离的可视化(有动图) flyfish 马氏距离的计算涉及到协方差矩阵的逆,而协方差矩阵的特征值和特征向量决定了数据分布的形状。椭圆的中心是数据的均值向量,椭圆的形状和方向由协方差矩阵的特征向量和特征值决定。椭圆的长轴和短轴长度与马氏距离的值相关联,较大的马氏距离对应于较大的椭圆。 马氏距离 马氏距离是一种度量,表示一个点到数据集中心(平均值)的距离,同时考虑了数据集的形状和

C++ 字符串编辑距离代价计算

描述 给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。 数据范围:0≤∣𝑠𝑡𝑟1∣,∣𝑠𝑡𝑟2∣≤50000≤∣str1∣,∣str2∣≤5000,0≤𝑖𝑐,𝑑𝑐,𝑟𝑐≤10000 0≤ic,dc,rc≤10000  要求:空间复杂度 𝑂(𝑛)O(n),时间复杂

DDMA信号处理以及数据处理的流程---距离速度测量

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的文章大约是一个7-8篇左右。 最终效果如下: 整体文件的目录树如下: 本篇文章主要讲的是目标的距