BZOJ3170: [Tjoi2013]松鼠聚会 - 暴力
描述
有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1。现在N个松鼠要走到一个松鼠家去,求走过的最短距离。
题解
简直就是个高中数学题啊。。。蒟蒻数学不好,学不来呜
松鼠$i $ 和 $j$ 的距离为$ \max{\left\vert X_i - X_j \right\vert, \left\vert Y_i - Y_j\right\vert } $
但是我们不能在很短的时间内求出对于所有$i$和$j$ 的$\max$, 所以只能通过加绝对值让$\max$去掉。
首先1. $\max{a, b} = (\left\vert a + b\right\vert + \left\vert a - b\right\vert) \div 2$
并且 2.$ \left\vert \left\vert a\right\vert - \left\vert b\right\vert \right\vert + \left\vert \left\vert a\right\vert + \left\vert b\right\vert \right\vert = \left\vert a - b\right\vert + \left\vert a + b\right\vert$
我们通过式子1算出$ \max{\left\vert X_i - X_j \right\vert, \left\vert Y_i - Y_j\right\vert } = ( \left\vert \left\vert X_i - X_j \right\vert - \left\vert Y_i - Y_j\right\vert \right\vert + \left\vert \left\vert X_i - X_j \right\vert + \left\vert Y_i - Y_j \right\vert \right\vert ) \div 2$
然后再通过2式就变成了 $( \left\vert ( X_i-Y_i ) - (X_j - Y_j) \right\vert + \left\vert (X_i - Y_i) + (X_j - Y_j) \right\vert) \div 2$
令$a_i = X_i - Y_i $ $b_i = X_i + Y_i$
算出所有的$\left\vert a_i - a_j \right\vert $ 和$\left\vert b_i - b_j\right\vert$ 再除 2, 取答案最小的$i$
算$\left\vert a_i - a_j \right\vert $ 时需要排序求前缀和计算。
打绝对值累死我了。。、
代码
#include<cstring>
#include<cstdio>
#include<algorithm>
#define rd read()
#define ll long long
using namespace std; const int N = 2e5; ll sumx[N], sumy[N], n, ans = 1e18; struct node {
ll x, y;
ll xx, yy;
ll disx, disy;
}a[N]; ll read() {
ll X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} int cmpx(const node &A, const node &B ) {
return A.xx < B.xx;
} int cmpy(const node &A, const node &B) {
return A.yy < B.yy;
} int main()
{
n = rd;
for(int i = ; i <= n; ++i) {
a[i].x = rd * ;
a[i].y = rd * ;
a[i].xx = (a[i].x + a[i].y) >> ;
a[i].yy = (a[i].x - a[i].y) >> ;
}
sort(a+, a++n, cmpx);
for(int i = ; i <= n; ++i) sumx[i] = sumx[i - ] + a[i].xx;
for(int i = ; i <= n; ++i) {
a[i].disx = a[i].xx * i - sumx[i];
a[i].disx += sumx[n] - sumx[i] - (n - i) * a[i].xx;
}
sort(a+, a++n, cmpy);
for(int i = ; i <= n; ++i) sumy[i] = sumy[i - ] + a[i].yy;
for(int i = ; i <= n; ++i) {
a[i].disy = a[i].yy * i - sumy[i];
a[i].disy += sumy[n] - sumy[i] - (n - i) * a[i].yy;
if(a[i].disy + a[i].disx < ans) ans = a[i].disx + a[i].disy;
}
printf("%lld\n", ans >> );
}
BZOJ3170: [Tjoi2013]松鼠聚会 - 暴力的更多相关文章
- BZOJ3170: [Tjoi2013]松鼠聚会(切比雪夫距离转曼哈顿距离)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1524 Solved: 803[Submit][Status][Discuss] Descripti ...
- BZOJ3170 [Tjoi2013]松鼠聚会 切比雪夫距离 - 曼哈顿距离 - 前缀和
BZOJ3170 题意: 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最 ...
- BZOJ3170: [Tjoi2013]松鼠聚会
[传送门:BZOJ3170] 简要题意: 给出n个点的坐标,规定两个点的距离=max(|x1-x2|,|y1-y2|) 要求选出一个点,使得这个点到所有点的距离和最小 题解: 切比雪夫转换例题 将一个 ...
- Bzoj3170: [Tjoi2013]松鼠聚会 (切比雪夫距离)
题目链接 显然,题目要求我们求切比雪夫距离,不会的可以去看一下attack的博客. 考虑枚举所有的点 转换为曼哈顿距离后. 那么对于这个点的路程和是. \[\sum_{i=1}^n | x_i - x ...
- 【bzoj3170】[Tjoi2013]松鼠聚会
3170: [Tjoi2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1670 Solved: 885[Submit][Statu ...
- BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和
BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和 题意:有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点, ...
- [TJOI2013]松鼠聚会 曼哈顿距离
[TJOI2013]松鼠聚会 luogu P3964 首先容易得到两点间距离是\(max(|x_1-x_2|, |y_1-y_2|)\)(即切比雪夫距离) 然后有个套路:原\((x,y)\)求曼哈顿距 ...
- [TJOI2013]松鼠聚会(枚举)
[TJOI2013]松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x, ...
- 洛谷P3964 [TJOI2013]松鼠聚会 [二分答案,前缀和,切比雪夫距离]
题目传送门 松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示, ...
随机推荐
- 并发基础(四) java中线程的状态
一.程的五种状态 线程的生命周期可以大致分为5种,但这种说法是比较旧的一种说法,有点过时了,或者更确切的来说,这是操作系统的说法,而不是java的说法.但对下面所说的六种状态的理解有所帮助,所以也 ...
- selenium+python自动化95-弹出框死活定位不到
前言 部分小伙伴学了selenium的alert后,就不管啥弹出框都去用alert,这是行不通的,看到弹出框,先要确定是不是alert,是才能用,不是的话肯定不能用. 有些弹出框是div层,这种跟平常 ...
- 最近玩的centos7.3用的防火墙转载
CentOS 7 firewalld使用简介 1.firewalld简介 firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务:第二个就是加入了防火墙的“zone ...
- 25. LiveBos调用class实例
var v= ABS_LOADBEAN('com.apex.mmsqljdbc.TestJDBC');var date=ABS_SQLVALUE("select to_char(?,'yyy ...
- 29. 在Linux上使用unzip解压以默认编码解压,中文文件名会出现乱码
解决办法: 下载p7zip-9.13-1.el5.rf.x86_64.rpm和p7zip-plugins-9.13-1.el5.rf.x86_64.rpm包 用以下方法安装后,使用7z x filen ...
- Redis 几个全局命令, 以及事物
1, 清空当前数据库的所有数据 => flushdb 2, 清空所有数据库的所有数据 => flushall 3, key 值检索命令 => scan num match if 会 ...
- C++Primer笔记-----继承
==========================================================================day11 面向对象程序设计============ ...
- mysql改数据库名称
第一种方法: 1.创建需要改成新名的数据库.2.mysqldum 导出要改名的数据库3.删除原来的旧库(确定是否真的需要)当然这种方法虽然安全,但是如果数据量大,会比较耗时,哎,当时连这种方法都没有想 ...
- ansible随记
先来看一下ansible架构图: 一.官网的语法简单介绍 #选择的主机组 - hosts: webservers #这个是变量 vars: http_port: 80 max_cl ...
- Session的常用场景
session :存储浏览器sessionID值保存在客户端,sessionID的key:data 数据存储在服务器上 会话管理,用户登录验证,权限访问控制,购物车,临时数据.