洛谷P3964松鼠聚会
题意:求最小的从某一个点到其余点的切比雪夫距离和。
将一个图中的(x,y)(x,y)坐标转到新坐标(x+y,x−y)(x+y,x−y)后,图中的曼哈顿距离就是新图中的切比雪夫距离,
证明:分类讨论,
1.x2>x1,y2>y1时,x2−x1+y2−y1=x2+y2−(x1+y2)就是新坐标的X差。
2.x2>x1,y2<y1时,x2−x1+y1−y2=x2−y2−(x1−y1)就是新坐标的Y差。
其余情况加绝对值。
然后新图中的坐标(X,Y)转回旧坐标后,有2x=X+Y,2y=X−Y。
然后可以用曼哈顿距离求解。
易得:
i到各个节点的曼哈顿距离等于∑k=nk=1 (x[k]−x[i])+∑k=nk=1 (y[k]−y[i])在x,y数组递增的情况下。
先处理△x的情况,
原式=x[i]−x[1]+x[i]−x[2]......+x[i]−x[i]+x[i+1]−x[i]+x[i+2]−x[i]......+x[n]−x[i]
=i∗x[i]−Sum[i]−(n−i)∗x[i]+Sum[n]−Sum[i]
△y同理。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
int sumx[1010000], sumy[10010000];
int x[1001000], y[1001000];
int datax[1001000], datay[1001000];
int n, minn = 9223372036854775807;
signed main()
{
scanf("%lld", &n);
for (int i = 1, x1, y1; i <= n; i++)
scanf("%lld%lld", &x1, &y1), x[i] = datax[i] = x1 + y1, y[i] = datay[i] = x1 - y1;
sort(datax + 1, datax + 1 + n);
sort(datay + 1, datay + 1 + n);
for (int i = 1; i <= n; i++)
sumx[i] = sumx[i - 1] + datax[i], sumy[i] = sumy[i - 1] + datay[i];
for (int i = 1; i <= n; i++)
{
int ans = 0;
int idx = lower_bound(datax + 1, datax + 1 + n, x[i]) - datax;
int idy = lower_bound(datay + 1, datay + 1 + n, y[i]) - datay;
// printf("%d %d\n", idx, idy);
ans += idx * datax[idx] - sumx[idx] - (n - idx) * datax[idx] + sumx[n] - sumx[idx];
ans += idy * datay[idy] - sumy[idy] - (n - idy) * datay[idy] + sumy[n] - sumy[idy];
minn = min(minn, ans);
}
printf("%lld", minn / 2);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 通过一个DEMO理解MCP(模型上下文协议)的生命周期
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 7 个最近很火的开源项目「GitHub 热点速览」
· DeepSeekV3:写代码很强了
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提
· AI浏览器自动化实战