[Tjoi 2013]松鼠聚会
3170: [Tjoi 2013]松鼠聚会
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1318 Solved: 664
[Submit][Status][Discuss]
Description
有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1。现在N个松鼠要走到一个松鼠家去,求走过的最短距离。
Input
第一行给出数字N,表示有多少只小松鼠。0<=N<=10^5
下面N行,每行给出x,y表示其家的坐标。
-10^9<=x,y<=10^9
Output
表示为了聚会走的路程和最小为多少。
Sample Input
-4 -1
-1 -2
2 -4
0 2
0 3
5 -2
Sample Output
HINT
Source
暴力算法O(n2),直接暴力枚举每一个点作为集合点,然后计算距离。
提供一种太暴力的做法 运用贪心策略
我们发现应该尽量让松鼠少走路,那么集合点应该尽量靠近中间,计算时间复杂度发现差不多可以扫1000个点
那我们就可以避免扫10W而去扫(n/2-500,n/2+500),不断更新答案,理论上可以被卡掉。。但是貌似还没被卡过??
然后说正解:
题目要求的是Max(|x1-x2|,|y1-y2| ); 求得是切比雪夫距离
切比雪夫是啥??不喜欢他(她?)。。我们还是换成曼哈顿吧
简单证明一下:
对于曼哈顿距离,d=(|x1-x2|+|y1-y2|);
我们把式子展开:
d=Max(Max(x1-x2,x2-x1)+Max(y1-y2,y2-y1))
d=Max(x1-x2+y1-y2,x1-x2+y2-y1,x2-x1+y1-y2,x2-x1+y2-y1)
将同一个坐标合并起来:发现:
d=Max( (x1+y1) - (x2+y2 ) , (x1-y1)-(x2-y2), -(x1-y1)+(x2-y2),-(x1+y1)+(x2+y2))
d=Max( | (x1+y1) -(x2+y2) |,| (x1-y1)-(x2-y2) | )
所以x=x1+y1,y=x1-y1 就转化成了切比雪夫距离,换一下元
x=(x+y)/2,y=(x-y)/2就是把切比雪夫转化为曼哈顿
我们在排一下序,求个前缀和就完事了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
struct sta{
ll x,y;
}k[]; template <typename _t>
inline _t read(){
_t sum=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){sum=sum*+ch-'',ch=getchar();}
return sum*f;
} int n;
int lx[],ly[];
ll sumx[],sumy[];
int main(){
n=read<int>();
for(int i=;i<=n;++i){
int x,y;
x=read<int>(),y=read<int>();
k[i].x=lx[i]=x+y,k[i].y=ly[i]=x-y;
}
sort(lx+,lx+n+);sort(ly+,ly+n+);
for(int i=;i<=n;++i)
sumx[i]=sumx[i-]+lx[i],
sumy[i]=sumy[i-]+ly[i];
ll ans=(ll)1e30;
for(int i=;i<=n;++i){
int pos=lower_bound(lx+,lx+n+,k[i].x)-lx;
ll sum=sumx[n]-sumx[pos]-k[i].x*(n-pos)+k[i].x*pos-sumx[pos];
pos=lower_bound(ly+,ly+n+,k[i].y)-ly;
sum+=sumy[n]-sumy[pos]-k[i].y*(n-pos)+k[i].y*pos-sumy[pos];
ans=min(ans,sum);
}
printf("%lld\n",ans>>);
return ;
}
[Tjoi 2013]松鼠聚会的更多相关文章
- bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)
题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...
- BZOJ3170: [Tjoi 2013]松鼠聚会
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 531 Solved: 249[Submit][Statu ...
- BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 3170: [Tjoi 2013]松鼠聚会( sort )
题目的距离为max(|x1-x2|, |y1-y2|) (切比雪夫距离). 切比雪夫距离(x, y)->曼哈顿距离((x+y)/2, (x-y)/2) (曼哈顿(x, y)->切比雪夫(x ...
- Bzoj 3170[Tjoi 2013]松鼠聚会 曼哈顿距离与切比雪夫距离
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1318 Solved: 664[Submit][Stat ...
- 【bzoj3170】[Tjoi 2013]松鼠聚会 旋转坐标系
题目描述 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. 输入 ...
- bzoj 3170: [Tjoi 2013]松鼠聚会
#include<cstdio> #include<iostream> #include<algorithm> #define M 100008 using nam ...
- bzoj 3170 Tjoi 2013 松鼠聚会 曼哈顿距离&&切比雪夫距离
因为曼哈顿距离很好求,所以要把每个点的坐标转换一下. 转自:http://blog.csdn.net/slongle_amazing/article/details/50911504 题解 两个点的切 ...
- 3170: [Tjoi 2013]松鼠聚会
题目大意 给定n个点,找到一个点使这个点到其他所有点的切比雪夫距离之和最小. 题解 我们知道切比雪夫距离和曼哈顿距离的转化公式 \(1\)表示切比雪夫距离,\(2\)表示曼哈顿距离 我们有: \(x_ ...
随机推荐
- Ditto在教学上的应用
Ditto在教学上的应用 我喜欢iOS和macOS生态的一个原因是,你在iphone上看到一段好文字,复制一下,到macbook中粘贴一下就可以了,这体验太爽了. 大家可能相信大家都听过这样一则笑话: ...
- 高级软件工程2017第6次作业——团队项目:Alpha阶段综合报告
1.版本测试报告 1.1在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? Bug分类 Bug内容 Fixed 编辑博文时改变文字格式会刷新界面 Can't reproduced 无 N ...
- 基于微信小程序的失物招领系统的Postmortem
基于微信小程序的失物招领系统的Postmortem 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 对于我们团队要解决的问题和实现的功能在项目开始就 ...
- 学号:201621123032 《Java程序设计》第7周学习总结
1:本周学习总结 1.1:思维导图:Java图形界面总结 2:书面作业 2.1: GUI中的事件处理 2.1.1: 写出事件处理模型中最重要的几个关键词 事件:如鼠标单击,滑动,输入汉字等. 事件源: ...
- mvc架构模式概念
MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器".MVC应用程序总是由这三个部分组成.Event(事件)导致C ...
- 常用Mysql数据库操作语句
用户管理: 1.新建用户: 语法msyql>CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username - 你将创建 ...
- 记一下webstorm快键键
#####新建文件````ctrl+alt+insert````#####结构速写````div>ul>li*4>p | div>h1+p | input:text | div ...
- thinkphp中的常见静态常亮
thinkphp __PUBLIC__的定义 __ROOT__等常量的定义 1 2 3 4 5 6 7 8 9 '__TMPL__' => APP_TMPL_PATH, // 项目 ...
- c语言中宏定义和常量定义的区别
他们有共同的好处就是"一改全改,避免输入错误"哪两者有不同之处吗?有的. 主要区别就在于,宏定义是在编译之前进行的,而const是在编译阶段处理的 宏定义不占用内存单元而const ...
- GIT入门笔记(18)- 标签创建和管理
git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id: git tag -a <tagname> -m "blablabla ...