[TJOI2013] 松鼠聚会 题解
[TJOI2013] 松鼠聚会 题解
切比雪夫距离
切比雪夫距离指的是在平面上的两个点
切比雪夫距离与曼哈顿距离之间可以相互转换
切比雪夫—>曼哈顿:
曼哈顿—>切比雪夫:
这样就可以将切比雪夫距离转化为曼哈顿距离进行计算了。
好的,那么这道题就将切比雪夫下的坐标转化成曼哈顿下的坐标即可。为了防止浮点数对时间复杂度的影响,我们转化时先不除二,等到判断时再除二。
那么如何快速求出曼哈顿距离之和呢
可以考虑到,我们以
代码
/*
* Author:Ehundategh
* Update:2023/10/10
* Title:squ.cpp
* You steal,I kill
*/
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 100010
using namespace std;
struct node{
long long X,Y;
}Node[MAXN];
bool cmp(node a,node b){return a.X<b.X;}
long long n,PreX[MAXN],PreY[MAXN],CopyY[MAXN],Ans=0x7fffffffffffffff;
node Change(node a){
int Temp=a.X;
a.X=a.X+a.Y;
a.Y=Temp-a.Y;
return a;
}
long long Check(int Pos){
long long Ret=0,Y=Node[Pos].Y;
Ret+=(Pos-1)*Node[Pos].X-PreX[Pos-1];
Ret+=PreX[n]-PreX[Pos]-(n-Pos)*Node[Pos].X;
Pos=lower_bound(CopyY+1,CopyY+n+1,Node[Pos].Y)-CopyY;
Ret+=(Pos-1)*Y-PreY[Pos-1];
Ret+=PreY[n]-PreY[Pos]-(n-Pos)*Y;
return Ret>>1;
}
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&Node[i].X,&Node[i].Y);
Node[i]=Change(Node[i]);
CopyY[i]=Node[i].Y;
}
sort(CopyY+1,CopyY+n+1);
sort(Node+1,Node+n+1,cmp);
for(int i=1;i<=n;i++){
PreX[i]=PreX[i-1]+Node[i].X;
PreY[i]=PreY[i-1]+CopyY[i];
}
for(int i=1;i<=n;i++){
Ans=min(Check(i),Ans);
}
printf("%lld",Ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】