P3964 [TJOI2013]松鼠聚会
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=1ndis(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+1nxj−(n−rankx)×xi
再去一波括号得到最终公式(sxi=∑j=1ixisx_i=\sum_{j=1}^i x_isxi=∑j=1ixi)
∑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(rankxxi−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]松鼠聚会相关推荐
- P3964 [TJOI2013]松鼠聚会【切比雪夫距离】
P3964 [TJOI2013]松鼠聚会 题意:给出nnn个点(xi,yi)(x_i,y_i)(xi,yi),找到某个点,使得所有点到该点的切比雪夫距离和最小. 一. A(x1,y1),B(x2, ...
- 算法笔记——曼哈顿距离,切比雪夫距离,曼哈顿距离之和 P3964 [TJOI2013]松鼠聚会
P3964 [TJOI2013]松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以 ...
- 洛谷 P3964 [TJOI2013]松鼠聚会(切比雪夫距离和曼哈顿距离转换)
这个距离的定义就是切比雪夫距离的定义.切比雪夫距离的计算式子是:d = max(|x1 - x2|,|y1 - y2|) 在切比雪夫距离的定义下,一个点和周围相邻的8个点的距离相等(都为1). 如果将 ...
- 洛谷P3964 [TJOI2013]松鼠聚会 切比雪夫距离转曼哈顿距离
https://www.luogu.com.cn/problem/P3964 切比雪夫距离为max(|x-o.x|,|y-o.y|),曼哈顿距离为|x-o.x|+|y-o.y| 当我们要求n个点的到1 ...
- 洛咕 P3964 [TJOI2013]松鼠聚会
有个结论就是把坐标\((x,y)\)变形成\(((x+y)/2,(x-y)/2)\),切比雪夫距离就变成了曼哈顿距离. 所以变换一下坐标直接统计答案即可. // luogu-judger-enable ...
- BZOJ3170: [Tjoi2013]松鼠聚会(切比雪夫距离转曼哈顿距离)
Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1524 Solved: 803 [Submit][Status][Discuss] Descrip ...
- [TJOI2013]松鼠聚会
题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为点( ...
- 洛谷3964 [TJOI2013]松鼠聚会
题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为点( ...
- BZOJ3170: [Tjoi2013]松鼠聚会 - 暴力
描述 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. 题解 简直 ...
最新文章
- linux之sed命令的用法
- jQuery经典案例【倒计时】
- matlab imcrop 对应python函数_Python精讲Numpy基础,大牛笔记详细解释
- 操作系统--文件管理之索引
- 智慧交通day02-车流量检测实现10:多目标追踪实现
- 聊一聊开发常用小工具
- Properties的使用
- pythonjava哪个好学_Python和Java哪个好学?没基础学python
- C++实现调用C#(CLI)方法
- 【剑指offer】62、圆圈中最后剩下的数字
- php 生成vbs文件路径,vbs下一些取特殊路径的方法总结
- 好用的小巧的免费功能强大的电脑截图软件Snipaste下载安装
- 带文本的标签自动生成font标签
- hexo+yilia添加百度统计和Google统计
- mysql2008r2 64位下载_mssql2008r2 64位下载
- 深度沉浸能力的锻炼方法
- 【智能优化算法-正弦余弦算法】基于反向正弦余弦算法求解高维优化问题附matlab代码
- MySQL-索引概述及结构
- 用python放烟花咯
- 汽车电路的主要构成元件和电路图种类