题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3170

通过分析可以发现,题目所说的两点之间的距离就是切比雪夫距离。

两点之间欧几里得距离:\(\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}\)

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

两点之间切比雪夫距离:\(max(|x1-x2|,|y1-y2|)\)

曼哈顿距离转切比雪夫距离:\((x,y)--->(x+y,x-y)\)

切比雪夫距离转曼哈顿距离:\((x,y)--->(\frac{x+y}{2},\frac{x-y}{2})\)

由于一个点到多个点的曼哈顿距离可以通过前缀和后缀和\(O(1)\)求,而切比雪夫只能\(O(n)\)求,所以我们这题只需要把坐标转化一下求曼哈顿距离即可。为了避免\(double\),转坐标的时候不除二,最后答案再除二。

时间复杂度:\(O(nlogn)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll; const int maxn=1e5+5; int n;ll res=1e18;
ll sum_pre[maxn],sum_suf[maxn],ans[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct point {
int x,y,id;
}p[maxn]; bool cmp_x(point a,point b) {return a.x<b.x;} bool cmp_y(point a,point b) {return a.y<b.y;} int main() {
n=read();
for(int i=1;i<=n;i++) {
int x=read(),y=read();
p[i].x=x+y,p[i].y=x-y;
p[i].id=i;
}
sort(p+1,p+n+1,cmp_x);
for(int i=n;i;i--)
sum_suf[i]=sum_suf[i+1]+p[i].x;
for(int i=1;i<=n;i++) {
sum_pre[i]=sum_pre[i-1]+p[i].x;
if(i!=1)ans[p[i].id]=1ll*p[i].x*(i-1)-sum_pre[i-1];
if(i!=n)ans[p[i].id]+=sum_suf[i+1]-1ll*p[i].x*(n-i);
}
sort(p+1,p+n+1,cmp_y);
for(int i=n;i;i--)
sum_suf[i]=sum_suf[i+1]+p[i].y;
for(int i=1;i<=n;i++) {
sum_pre[i]=sum_pre[i-1]+p[i].y;
if(i!=1)ans[p[i].id]+=1ll*p[i].y*(i-1)-sum_pre[i-1];
if(i!=n)ans[p[i].id]+=sum_suf[i+1]-1ll*p[i].y*(n-i);
res=min(res,ans[p[i].id]>>1);
}
printf("%lld\n",res);
return 0;
}

BZOJ3170:[TJOI2013]松鼠聚会的更多相关文章

  1. BZOJ3170: [Tjoi2013]松鼠聚会(切比雪夫距离转曼哈顿距离)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1524  Solved: 803[Submit][Status][Discuss] Descripti ...

  2. BZOJ3170 [Tjoi2013]松鼠聚会 切比雪夫距离 - 曼哈顿距离 - 前缀和

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

  3. BZOJ3170: [Tjoi2013]松鼠聚会 - 暴力

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

  4. BZOJ3170: [Tjoi2013]松鼠聚会

    [传送门:BZOJ3170] 简要题意: 给出n个点的坐标,规定两个点的距离=max(|x1-x2|,|y1-y2|) 要求选出一个点,使得这个点到所有点的距离和最小 题解: 切比雪夫转换例题 将一个 ...

  5. Bzoj3170: [Tjoi2013]松鼠聚会 (切比雪夫距离)

    题目链接 显然,题目要求我们求切比雪夫距离,不会的可以去看一下attack的博客. 考虑枚举所有的点 转换为曼哈顿距离后. 那么对于这个点的路程和是. \[\sum_{i=1}^n | x_i - x ...

  6. 【bzoj3170】[Tjoi2013]松鼠聚会

    3170: [Tjoi2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1670  Solved: 885[Submit][Statu ...

  7. BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和

    BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和 题意:有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点, ...

  8. [TJOI2013]松鼠聚会 曼哈顿距离

    [TJOI2013]松鼠聚会 luogu P3964 首先容易得到两点间距离是\(max(|x_1-x_2|, |y_1-y_2|)\)(即切比雪夫距离) 然后有个套路:原\((x,y)\)求曼哈顿距 ...

  9. [TJOI2013]松鼠聚会(枚举)

    [TJOI2013]松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x, ...

  10. 洛谷P3964 [TJOI2013]松鼠聚会 [二分答案,前缀和,切比雪夫距离]

    题目传送门 松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示, ...

随机推荐

  1. ETL应用:一种处理接口的Pro*C实现方法

    2007年,当时项目所有ETL采用C编写,实现了ETL基本功能.当接口很多时,为保证文件获取效率,做好接口可配置:文件维护中经常会出现接口晚到情况,需要有一种方法能将接口晚到信息写入数据库,便于短信告 ...

  2. $.proxy() 的妙用

    $.proxy() 最主要就是用来修改函数执行时的上下文对象的. 先看以下情景: <div id="panel" style="display:none;" ...

  3. springboot中Controller没有被扫描

    今天给客户开发登陆的密码加密需求,研究一下想,需要在本地搭一套环境,前台用js实现RAS加密,后台使用java解密.本是一套非常简单的环境,看最近springboot比较常用,所以想要搭一下sprin ...

  4. jack server 常见错误解决方法【转】

    本文转载自:https://blog.csdn.net/qq_27061049/article/details/70156200 jack 服务常见错误解决方法 当你编译Android时,你不需要修改 ...

  5. jsp路径问题

    绝对路径:/StudentInfo/images/login.jpg 相对路径:images/login.jpg 路径前面的第一个/代表tomcate目录下面的webapps这个文件夹 jsp的Adv ...

  6. Windows下MetaMap工具安装

    Windows下MetaMap工具安装 一.Main MetaMap安装 Prerequisties 12G磁盘空间 JAVA6 or newer JRE or SDK installed Downl ...

  7. JavaWeb -- JSP+JavaBean模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. JSP+JavaBean模式适合开发业务 ...

  8. QT 带有菜单项的ToolButton

    QToolBar *pToolBar = new QToolBar; QToolButton *pMenuBtn = new QToolButton; pMenuBtn->setText(tr( ...

  9. linux命令:mv命令

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...

  10. c# 判断一个ip通不通 能不能ping通

    方法一: 已经证实能用的. using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...