洛谷 P3964 松鼠聚会
题目链接
参考链接
题解:
这道题目的距离其实就是切比雪夫距离,又称棋盘距离,也就是D=max(∣x2−x1∣,∣y2−y1∣)D = max(|x_2-x_1|,|y_2-y_1|)D=max(∣x2−x1∣,∣y2−y1∣)。与之有一定联系的距离是曼哈顿距离,假设A(x1,y1),B(x2,y2)A(x_1,y_1),B(x_2,y_2)A(x1,y1),B(x2,y2),那么∣AB∣=∣x2−x1∣+∣y2−y1∣|AB|=|x_2-x_1|+|y_2-y_1|∣AB∣=∣x2−x1∣+∣y2−y1∣。
我们将曼哈顿距离化开:
D=∣x2−x1∣+∣y2−y1∣=max(x2−x1+y2−y1,x1−x2+y2−y1,x1−x2+y1−y2,x2−x1+y1−y2)=max{∣(x2+y2)−(x1+y1)∣,∣(x2−y2)−(x1−y1)∣}D=|x_2-x_1|+|y_2-y_1|=max(x_2-x_1+y_2-y_1,x_1-x_2+y_2-y_1,x_1-x_2+y_1-y_2,x_2-x_1+y_1-y_2)=max\{|(x_2+y_2)-(x_1+y_1)|,\ |(x_2-y_2)-(x_1-y_1)|\}D=∣x2−x1∣+∣y2−y1∣=max(x2−x1+y2−y1,x1−x2+y2−y1,x1−x2+y1−y2,x2−x1+y1−y2)=max{∣(x2+y2)−(x1+y1)∣, ∣(x2−y2)−(x1−y1)∣}
上面这个形式其实和切比雪夫距离Dchess=max(∣x2−x1∣,∣y2−y1∣)D_{chess}=max(|x_2-x_1|,|y_2-y_1|)Dchess=max(∣x2−x1∣,∣y2−y1∣)形式上非常像,我们可以发现,曼哈顿意义下的(x1,y1)(x2,y2)(x_1,y_1)(x_2,y_2)(x1,y1)(x2,y2)两点的距离转化为切比雪夫意义下的(x2+y2,x2−y2)(x1+y1,x1−y1)(x_2+y_2,x_2-y_2)(x_1+y_1,x_1-y_1)(x2+y2,x2−y2)(x1+y1,x1−y1)两点的距离。
我们可以推广一下,给出曼哈顿意义下的坐标(x,y)(x,y)(x,y),可以转化成切比雪夫意义下的坐标(x+y,x−y)(x+y,x-y)(x+y,x−y)。
反过来,给了切比雪夫意义下的坐标(x,y)(x,y)(x,y),可以转化成曼哈顿意义下的坐标(x+y2,x−y2)(\frac{x+y}2,\frac{x-y}2)(2x+y,2x−y)。
有了上面这个转化怎么用呢?
我们现在假设dis(i,j)dis(i,j)dis(i,j)为曼哈顿意义下iii到jjj的曼哈顿距离。如果当前的终点是jjj,那么有ans=∑i=1ndis(i,j)ans=\sum_{i=1}^ndis(i,j)ans=∑i=1ndis(i,j),这个要是求的话,复杂度是O(n2)O(n^2)O(n2)。我们化简一下:
∑i=1ndis(i,j)=dis(1,j)+dis(2,j)+⋯+dis(n,j)\sum_{i=1}^ndis(i,j)=dis(1,j)+dis(2,j)+\dots+dis(n,j)∑i=1ndis(i,j)=dis(1,j)+dis(2,j)+⋯+dis(n,j)
我们现在用dis(i,j)dis(i,j)dis(i,j)中的一部分∣xi−xj∣|x_i-x_j|∣xi−xj∣举例化简:
∑i=1nΔx=∣x1−xj∣+∣x2−xj∣+⋯+∣xj−xj∣+∣xj+1−xj∣+⋯+∣xn−xj∣\sum_{i=1}^n\Delta x=|x_1-x_j|+|x_2-x_j|+\dots+|x_j-x_j|+|x_{j+1}-x_j|+\dots+|x_n-x_j|∑i=1nΔx=∣x1−xj∣+∣x2−xj∣+⋯+∣xj−xj∣+∣xj+1−xj∣+⋯+∣xn−xj∣
我们将横坐标排序成递增,容易发现∣xj−xj∣|x_j-x_j|∣xj−xj∣之前的式子都可以拆掉绝对值化简;∣xj+1−xj∣|x_{j+1}-x_j|∣xj+1−xj∣及以后的式子可以不用动,这样上面的式子就化简成:
=∑i=1j(xj−xi)+∑i=j+1n(xi−xj)=\sum_{i=1}^j(x_j-x_i)+\sum_{i=j+1}^n(x_i-x_j)=∑i=1j(xj−xi)+∑i=j+1n(xi−xj)
这个式子可以发现就是前缀和。dis(i,j)dis(i,j)dis(i,j)中的Δy\Delta yΔy可以同理化简。
因此这道题目的整体思路就是:
读入切比雪夫意义下的坐标并化为曼哈顿坐标,坐标可以先不除以2,到最后将答案除以2也可以。
将x,yx,yx,y分别排序为递增,并求出前缀和。
然后枚举终点,使用二分将xi,yix_i,y_ixi,yi在递增序列的位置找出,根据上面的式子,即可求出答案。
实现细节见代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const int MAXN = 1e6 + 10;int x[MAXN], y[MAXN], gx[MAXN], gy[MAXN], sumx[MAXN], sumy[MAXN], n;
int solve(int now) {int rx = lower_bound(gx + 1, gx + 1 + n, x[now]) - gx;int ry = lower_bound(gy + 1, gy + 1 + n, y[now]) - gy;int ans = rx * x[now] - sumx[rx] + sumx[n] - sumx[rx] - (n - rx) * x[now];ans += ry * y[now] - sumy[ry] + sumy[n] - sumy[ry] - (n - ry) * y[now];return ans;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {int x1, y1;cin >> x1 >> y1;x[i] = gx[i] = x1 + y1; // 这里不÷2,避免精度问题y[i] = gy[i] = x1 - y1;}sort(gx + 1, gx + 1 + n);sort(gy + 1, gy + 1 + n);for (int i = 1; i <= n; i++) {sumx[i] = sumx[i - 1] + gx[i];sumy[i] = sumy[i - 1] + gy[i];}int ans = 1e16;for (int i = 1; i <= n; i++) {ans = min(ans, solve(i));}cout << ans / 2 << endl;return 0;
}
洛谷 P3964 松鼠聚会相关推荐
- 洛谷P3964松鼠聚会
题目 题意:求最小的从某一个点到其余点的切比雪夫距离和. 将一个图中的\((x,y)\)坐标转到新坐标\((x+y,x-y)\)后,图中的曼哈顿距离就是新图中的切比雪夫距离, 证明:分类讨论, 1.\ ...
- 洛谷3964 松鼠聚会
题目地址 p3964 解题思路 首先学习一下曼哈顿距离和切比雪夫距离即二者之间的转换. 那根据切比雪夫距离的定义,只要x, y这个点到它周围八个点的距离都是一的话,就是使用的切比雪夫距离. 对于给出的 ...
- #距离#JZOJ 3256 BZOJ 3170 洛谷 3964 松鼠聚会
题目 分析 首先这个距离是切比雪夫距离,得把它转换成曼哈顿距离,也就是把(x,y)(x,y)(x,y)变成(x+y2,x−y2)(\frac{x+y}{2},\frac{x-y}{2})(2x+y, ...
- 洛谷· [AHOI2008]紧急集合 / 聚会
初见安~这里是传送门:洛谷P4281紧急集合/聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个 ...
- 松鼠聚会(洛谷-P3964)
题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为点( ...
- 洛谷 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 ...
- 洛谷 P1293 班级聚会
P1293 班级聚会 题目描述 毕业25年以后,我们的主人公开始准备同学聚会.打了无数电话后他终于搞到了所有同学的地址.他们有些人仍在本城市,但大多数人分散在其他的城市.不过,他发现一个巧合,所有地址 ...
- 洛谷 P3258 松鼠的新家 题解
题面 貌似这道题暴力加玄学优化就可以AC? 下面是正解: 1.树链剖分: 我们在u到v之间都放一个糖果,可以将松鼠它家u到v的糖果数都加1.每一次将a[i]到a[i+1] (a数组是访问顺序)的节点加 ...
最新文章
- 关于commonjs,AMD,CMD之间的异同
- 45 岁,2 万亿身价,苹果的人生才刚刚开始
- HDU 5861 Road 线段树区间更新单点查询
- Just h-index(主席树+二分)
- 图解一步步安装SharePoint Foundation 2010
- Fine-tunning适用情况
- 【转载】MySQL学习总结一
- 麻省理工学生令计算机系统升级不需重启
- 程序员如何从0到1搭建自己的技术博客
- 201512-1-数位之和
- 职场不是家,不会方法,如何混职场
- 搜索引擎提交软件_网站如何被搜索引擎快速收录?
- 服务器硬盘一直亮红灯怎么回事,请问:电脑的硬盘为何一直亮着红灯?且硬盘很 – 手机爱问...
- 人脸识别数据集概况及资源合集
- 考研数据结构之栈(2.5)——练习题之求解二次方根A的迭代函数,写出相应的递归算法和非递归算法(C表示)
- ​KeePassXC:社区驱动的开源密码管理器​
- 一种绝对提高开发水平的方法(转)
- 从零开始创建自己的博客
- linux里sub用法,awk中gsub和sub 的用法
- 单片机c语言程序编写步骤,Proteus运行Keil编写的51单片机C语言步骤