HyperlinkHyperlinkHyperlink

https://www.luogu.org/problemnew/show/P3964


DescriptionDescriptionDescription

随机跳题挑战第03次,T2

给定nnn个点的坐标,求出其中一个点使得它离其它点的切比雪夫距离最短

n≤105n\leq 10^5n≤105


SolutionSolutionSolution

记得在洛谷日报里看过这题,没过多久就切了

首先直接暴力搞复杂度显然是O(n2)O(n^2)O(n2)不可做

考虑将切比雪夫距离吊成曼哈顿距离

非众所周知,distqbxf([x.x,x.y],[y.x,y.y])=dismhd([x.x+x.y2,x.x−x.y2],[y.x+y.y2,y.x−y.y2])dist_{qbxf}([x.x,x.y],[y.x,y.y])=dis_{mhd}([\frac{x.x+x.y}2,\frac{x.x-x.y}2],[\frac{y.x+y.y}2,\frac{y.x-y.y}2])distqbxf​([x.x,x.y],[y.x,y.y])=dismhd​([2x.x+x.y​,2x.x−x.y​],[2y.x+y.y​,2y.x−y.y​])

有啥用呢?

我们枚举一个点pip_ipi​,求转化后坐标它的曼哈顿距离等价于转换前求它的切比雪夫距离

即ansi=∑j=1ndis(i,j)ans_i=\sum_{j=1}^ndis(i,j)ansi​=∑j=1n​dis(i,j)
=∑j=1n(∣xi−xj∣+∣yi−yj∣)=\sum_{j=1}^n(|x_i-x_j|+|y_i-y_j|)=∑j=1n​(∣xi​−xj​∣+∣yi​−yj​∣)
=∑j=1n∣xi−xj∣+∑j=1n∣yi−yj∣=\sum_{j=1}^n|x_i-x_j|+\sum_{j=1}^n|y_i-y_j|=∑j=1n​∣xi​−xj​∣+∑j=1n​∣yi​−yj​∣
=(∣x1−xi∣+∣x2−xi∣+…∣xn−xi∣)+(∣y1−yi∣+∣y2−yi∣+…∣yn−yi∣)=(|x_1-x_i|+|x_2-x_i|+…|x_n-x_i|)+(|y_1-y_i|+|y_2-y_i|+…|y_n-y_i|)=(∣x1​−xi​∣+∣x2​−xi​∣+…∣xn​−xi​∣)+(∣y1​−yi​∣+∣y2​−yi​∣+…∣yn​−yi​∣)

似乎有点前缀和的感觉2333

但这是绝对值,不能直接拆括号啊?

注意到,我们是将横纵坐标与每个点的横纵坐标做绝对值,所以这个顺序对答案是没有影响的

因此,我们可以对xxx和yyy排序

这样有什么用呢?

我们就可以知道在xxx,有多少个数比xix_ixi​大,这些大与xix_ixi​差得绝对值都是大的减xix_ixi​,较小的xxx与xix_ixi​的差的绝对值即为xix_ixi​减去较小的xxx,用式子表达即为

∑j=1n∣xi−xj∣\sum_{j=1}^n|x_i-x_j|∑j=1n​∣xi​−xj​∣
=(∣x1−xi∣+∣x2−xi∣+…∣xn−xi∣)=(|x_1-x_i|+|x_2-x_i|+…|x_n-x_i|)=(∣x1​−xi​∣+∣x2​−xi​∣+…∣xn​−xi​∣)
注意到正负的分界点恰好是xrankxx_{rank_x}xrankx​​,rankxrank_xrankx​是xix_ixi​的排名
根据“正数的绝对值是它本身,负数的绝对值是它的相反数,0的绝对值是0”所以原式等价于:
(xi−x1)+(xi−x2)+…(xrankx+1−xi)+…(xrankx+2−xi)+…(xn−xi)(x_i-x_1)+(x_i-x_2)+…(x_{rank_x+1}-x_i)+…(x_{rank_x+2}-x_i)+…(x_n-x_i)(xi​−x1​)+(xi​−x2​)+…(xrankx​+1​−xi​)+…(xrankx​+2​−xi​)+…(xn​−xi​)
去括号就变成了
=rankx×xi−∑i=1rankx+∑j=rankx+1nxj−(n−rankx)×xi=rank_x\times x_i-\sum_{i=1}^{rank_x}+\sum_{j=rank_x+1}^n x_j-(n-rank_x)\times x_i=rankx​×xi​−∑i=1rankx​​+∑j=rankx​+1n​xj​−(n−rankx​)×xi​

再去一波括号得到最终公式(sxi=∑j=1ixisx_i=\sum_{j=1}^i x_isxi​=∑j=1i​xi​)
∑j=1n∣xi−xj∣=2(rankxxi−sx[rankx])+sx[n]−n×xi\sum_{j=1}^n|x_i-x_j|=2(rank_xx_i-sx[rank_x])+sx[n]-n\times x_i∑j=1n​∣xi​−xj​∣=2(rankx​xi​−sx[rankx​])+sx[n]−n×xi​

所以我们只需一个二分一下rankxrank_xrankx​就行啦

yyy同理

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


CodeCodeCode

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;int n;
long long x[100001],y[100001],sx[100001],sy[100001],ylx[100001],yly[100001];
long long ans=4611686018427387903ll,sumx,sumy;
inline long long read()
{char c;int f=0,d=1;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
signed main()
{n=read();for(register int i=1,a,b;i<=n;i++){a=read();b=read();ylx[i]=x[i]=a+b;yly[i]=y[i]=a-b;//xyl=x原来2333}sort(x+1,x+1+n);sort(y+1,y+1+n);for(register int i=1;i<=n;i++) sx[i]=sx[i-1]+x[i],sy[i]=sy[i-1]+y[i];for(register int i=1;i<=n;i++){int rank_x=lower_bound(x+1,x+1+n,ylx[i])-x,rank_y=lower_bound(y+1,y+1+n,yly[i])-y;sumx=2*(rank_x*ylx[i]-sx[rank_x])+sx[n]-n*ylx[i];sumy=2*(rank_y*yly[i]-sy[rank_y])+sy[n]-n*yly[i];ans=min(ans,(long long)sumx+sumy);}printf("%lld\n",ans>>1LL);
}

P3964 [TJOI2013]松鼠聚会相关推荐

  1. P3964 [TJOI2013]松鼠聚会【切比雪夫距离】

    P3964 [TJOI2013]松鼠聚会 题意:给出nnn个点(xi,yi)(x_i,y_i)(xi​,yi​),找到某个点,使得所有点到该点的切比雪夫距离和最小. 一. A(x1,y1),B(x2, ...

  2. 算法笔记——曼哈顿距离,切比雪夫距离,曼哈顿距离之和 P3964 [TJOI2013]松鼠聚会

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

  3. 洛谷 P3964 [TJOI2013]松鼠聚会(切比雪夫距离和曼哈顿距离转换)

    这个距离的定义就是切比雪夫距离的定义.切比雪夫距离的计算式子是:d = max(|x1 - x2|,|y1 - y2|) 在切比雪夫距离的定义下,一个点和周围相邻的8个点的距离相等(都为1). 如果将 ...

  4. 洛谷P3964 [TJOI2013]松鼠聚会 切比雪夫距离转曼哈顿距离

    https://www.luogu.com.cn/problem/P3964 切比雪夫距离为max(|x-o.x|,|y-o.y|),曼哈顿距离为|x-o.x|+|y-o.y| 当我们要求n个点的到1 ...

  5. 洛咕 P3964 [TJOI2013]松鼠聚会

    有个结论就是把坐标\((x,y)\)变形成\(((x+y)/2,(x-y)/2)\),切比雪夫距离就变成了曼哈顿距离. 所以变换一下坐标直接统计答案即可. // luogu-judger-enable ...

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

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

  7. [TJOI2013]松鼠聚会

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

  8. 洛谷3964 [TJOI2013]松鼠聚会

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

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

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

最新文章

  1. linux之sed命令的用法
  2. jQuery经典案例【倒计时】
  3. matlab imcrop 对应python函数_Python精讲Numpy基础,大牛笔记详细解释
  4. 操作系统--文件管理之索引
  5. 智慧交通day02-车流量检测实现10:多目标追踪实现
  6. 聊一聊开发常用小工具
  7. Properties的使用
  8. pythonjava哪个好学_Python和Java哪个好学?没基础学python
  9. C++实现调用C#(CLI)方法
  10. 【剑指offer】62、圆圈中最后剩下的数字
  11. php 生成vbs文件路径,vbs下一些取特殊路径的方法总结
  12. 好用的小巧的免费功能强大的电脑截图软件Snipaste下载安装
  13. 带文本的标签自动生成font标签
  14. hexo+yilia添加百度统计和Google统计
  15. mysql2008r2 64位下载_mssql2008r2 64位下载
  16. 深度沉浸能力的锻炼方法
  17. 【智能优化算法-正弦余弦算法】基于反向正弦余弦算法求解高维优化问题附matlab代码
  18. MySQL-索引概述及结构
  19. 用python放烟花咯
  20. 汽车电路的主要构成元件和电路图种类

热门文章

  1. ios6.1.6可用微信_这是iOS 12.1的新增功能,今天可用
  2. mysql 查看字段详情
  3. Jasypt加密之行
  4. yolov2学习笔记
  5. Java NIO通信框架在电信领域的实践
  6. 美国网络司令部133支网络部队已拥有初步作战能力
  7. [HR规划]人力资源规划基本操作步骤(zt)
  8. Linux DPDK UIO
  9. 文正机械电子工程专业课_详解 | 机械电子工程专业学习内容与就业前景
  10. 用css、html、js模拟操作系统2