toj 4602 松鼠聚会
题目:
草原上住着一群小松鼠,每个小松鼠都有一个家。时间长了,大家觉得应该聚一聚。但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理。
每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点(x-1,y),(x+1,y),(x,y-1),(x,y+1),(x-1,y+1),(x-1,y-1),(x+1,y+1), (x+1,y-1)距离为1。
输入
第一行是一个整数N,表示有多少只松鼠。接下来N行,第i行是两个整数x和y,表示松鼠i的家的坐标。(0≤N≤105,−109≤x,y≤109)
输出
一个整数,表示松鼠为了聚会走的路程和最小是多少。
样例输入1
6
-4 -1
-1 -2
2 -4
0 2
0 3
5 -2
样例输出1
20
样例输入2
6
0 0
2 0
-5 -2
2 -2
-1 2
4 0
样例输出2
15
提示
在第一个样例中,松鼠在第二只松鼠家(-1,-2)聚会;在第二个样例中,松鼠在第一只松鼠家(0,0)聚会
题解:此题中定义的两点间距离,稍加分析就会发现是max(|xi-xj|, |yi-yj|);
此时需要用到一个公式:
max(|a|,|b|)=|(a+b)/2|+|(a-b)/2|;
于是,两点间距离成了:
|(xi-xj+yi-yj)/2|+|(xi-xj-yi+yj)/2|
= (|(xi+yi) - (xj+yj)| + |(xi-yi)-(xj-yj)|)/2
公式中需要用xi+yi, xi-yi的值,这其实对应于点(xi,yi)在另一个坐标系中的坐标。我们对原来的点坐标做变换,令x'=x+y, y'=x-y,则上面的公式变成了:
(|xi'-xj'| + |yi'-yj'|)/2
分析到这儿就好做了,对于给定的点pi, 计算∑(|xi'-xj'| + |yi'-yj'|)/2还是很容易的,先整体做一遍预处理,按x排序计算一遍x坐标的前缀和,再按y排序,计算一次y坐标的前缀和就可以了。
代码如下:
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
#define N 101000
struct point {
ll x, y;
ll sx, sy;
int cx, cy;
}p[N]; ll sumx, sumy; bool cmpx(point a, point b){
return a.x < b.x;
} bool cmpy(point a, point b){
return a.y < b.y;
} int main()
{
int n;
while(~scanf("%d", &n))
{
sumx = sumy = ;
ll x, y;
for(int i = ; i < n; i++)
{
scanf("%lld %lld", &x, &y);
p[i].x = x+y, p[i].y = x-y;
sumx += p[i].x, sumy += p[i].y;
}
sort(p, p+n, cmpx);
p[].sx = p[].cx = ;
for(int i = ; i < n; i++)
{
p[i].sx = p[i-].sx + p[i-].x;
p[i].cx = p[i-].cx + ;
} sort(p, p+n, cmpy);
p[].sy = p[].cy = ;
for(int i = ; i < n; i++)
{
p[i].sy = p[i-].sy + p[i-].y;
p[i].cy = p[i-].cy + ;
}
ll ans = -;
for(int i = ; i < n; i++)
{
ll tm = p[i].cx*p[i].x - p[i].sx + (sumx-p[i].sx-p[i].x)-((n-p[i].cx-)*p[i].x);
tm += p[i].cy*p[i].y - p[i].sy + (sumy-p[i].sy-p[i].y)-((n-p[i].cy-)*p[i].y);
if(ans == - || tm < ans)ans = tm;
}
printf("%lld\n", ans/);
}
return ;
}
toj 4602 松鼠聚会的更多相关文章
- 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 ...
- [Tjoi 2013]松鼠聚会
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1318 Solved: 664[Submit][Stat ...
- BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和
BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和 题意:有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点, ...
- 洛谷P3964 [TJOI2013]松鼠聚会 [二分答案,前缀和,切比雪夫距离]
题目传送门 松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示, ...
- 【BZOJ】【3170】【TJOI2103】松鼠聚会
切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...
- 【bzoj3170】[Tjoi2013]松鼠聚会
3170: [Tjoi2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1670 Solved: 885[Submit][Statu ...
随机推荐
- MySQL系统服务的安装删除
1.从该地址http://dev.mysql.com/downloads/mysql/中选择windows的版本,选择下载. 2.将下载的压缩包解压. 3.将根目录下的my-default.ini复制 ...
- Cisco Packet Tracer基本操作
IOS主要模式模式 描述 提示符用户执行模式 路由器受限检查,远程访问 Router>特权执行模式 路由器的详细检查:调试和测试,文件处理,远程访问 Router#全局配置模式 全局配置命令 R ...
- Vue-数据绑定原理
VueJS 使用 ES5 提供的 Object.defineProperty() 方法实现数据绑定. 感觉实现时主要是在 defineProperty 的 set 和 get 上做了很多文章,在 ge ...
- English-taxonomy
域.界.门.纲.目.科.属.种 Domain, Kingdom, Phylum, Class, Order, Family, Genus, Species
- day07——css布局解决方案之居中布局
转行学开发,代码100天——2018-03-23 1.水平居中 使用inline-block + text-align方法 先将子框由块级元素改为行内块元素,再通过设置行内块元素居中以实现水平居中 ...
- 【Unity知识点】安卓游戏如何在切后台后继续运行
解决方法很简单,在android项目AndroidManifest.xml文件中的activity中添加如下内容: android:configChanges="fontScale|keyb ...
- simhash文本相似度比较
simhash 在simhash中处理一个文本的步骤如下: 第一步,分词: 对文本进行分词操作,同时需要我们同时返回当前词组在文本内容中的权重(这基本上是目前所有分词工具都支持的功能). 第二步,计算 ...
- 21.线程,全局解释器锁(GIL)
import time from threading import Thread from multiprocessing import Process #计数的方式消耗系统资源 def two_hu ...
- java文件上传下载 使用SmartUpload组件实现
使用SmartUpload组件实现(下载jsmartcom_zh_CN.jar) 2017-11-07 1.在WebRoot创建以下文件夹,css存放样式文件(css文件直接拷贝进去),images存 ...
- Scala面向对象
面向对象编程OOP: Scala vs Java 都有这三特性 封装:把属性.方法封装到类中 Person: int id, String name, Date birthday.... 需要gett ...