切比雪夫距离

[TJOI2013]松鼠聚会

两个点 (x1,y1),(x2,y2) 的切比雪夫距离为:max(|x1x2|,|y1y2|)

这个东西非常不好处理,因为带最值。

学习了转换切比雪夫距离和曼哈顿距离的方法,而曼哈顿距离和是很好求的。

转换公式为 (x,y)(x+y,xy),即可将曼哈顿距离转换为切比雪夫距离。

|x1x2|+|y1y2|  &  max(|x1+y1x2y2|,|x1y1x2+y2|)

右边那个可以化成:

max(|(x1x2)+(y1y2)|,|(x1x2)(y1y2)|)

会发现这个东西和左边等价。

于是,证明成立。

那么返回去倒退即可得到:

切比雪夫转换为曼哈顿:(x,y)(x+y2,xy2)

于是此题便可以得以解决。

#include <stdio.h> #include <algorithm> #define LL long long using namespace std; const int N=1e5+3; inline LL min(LL x,LL y){return x<y?x:y;} inline LL rin() { LL s=0; bool bj=false; char c=getchar(); for(;(c>'9'||c<'0')&&c!='-';c=getchar()); if(c=='-')bj=true,c=getchar(); for(;c>='0'&&c<='9';c=getchar())s=(s<<1)+(s<<3)+(c^'0'); if(bj)s=-s; return s; } LL s_x; LL s_y; struct gyq { LL x,y; LL sum; inline void init() { int x_=rin(),y_=rin(); x=x_+y_;y=x_-y_; s_x+=x;s_y+=y; return; } }a[N]; inline bool myru_x(gyq x,gyq y){return x.x<y.x;} inline bool myru_y(gyq x,gyq y){return x.y<y.y;} int main() { int i,j; int n=rin(); for(i=1;i<=n;i++)a[i].init(); LL sum; sort(a+1,a+n+1,myru_x); for(i=1,sum=0;i<=n;i++)sum+=a[i].x,a[i].sum+=a[i].x*i-sum+(s_x-sum)-a[i].x*(n-i); sort(a+1,a+n+1,myru_y); for(i=1,sum=0;i<=n;i++)sum+=a[i].y,a[i].sum+=a[i].y*i-sum+(s_y-sum)-a[i].y*(n-i); LL ans=0x3f3f3f3f3f3f3f3f; for(i=1;i<=n;i++)ans=min(ans,a[i].sum); printf("%lld\n",ans>>1); return 0; }

[POI2006]MAG-Warehouse

这题 xy 要分开做。

由于求得的新坐标虽然是整点,但转变回去并不一定是,于是就可以扰动一下,看一下附近的一些点,找到一个转回去是整点的最小值即可。

但是 WA 了,90 分。

算了一下,这个鬼东西刚好会炸 long long。

于是学会了 int128 的使用方法(

#include <stdio.h> #include <algorithm> #define LL long long using namespace std; const int N=1e5+3; // inline LL abs(LL x){return (x<0)?(-x):(x);} inline LL min(LL x,LL y){return x<y?x:y;} inline __int128 min(__int128 x,__int128 y){return x<y?x:y;} inline LL rin() { LL s=0; bool bj=false; char c=getchar(); for(;(c>'9'||c<'0')&&c!='-';c=getchar()); if(c=='-')bj=true,c=getchar(); for(;c>='0'&&c<='9';c=getchar())s=(s<<1)+(s<<3)+(c^'0'); if(bj)s=-s; return s; } int n; __int128 s_x; __int128 s_y; __int128 cutt; struct gyq { LL x,y; LL t; inline void init() { LL x_=rin(),y_=rin(); x=x_+y_;y=x_-y_; t=rin(); s_x+=x*t; s_y+=y*t; cutt+=t; return; } }a[N]; inline bool myru_x(gyq x,gyq y){return x.x<y.x;} inline bool myru_y(gyq x,gyq y){return x.y<y.y;} inline __int128 cheak(LL x,LL y) { __int128 sum=0; for(int i=1;i<=n;i++) { sum+=abs(a[i].t*(a[i].x-x)); sum+=abs(a[i].t*(a[i].y-y)); } return sum; } inline void work(LL x,LL y) { if((x&1)==(y&1)){printf("%lld %lld\n",(x+y)>>1,(x-y)>>1);return;} __int128 s_1,s_2,s_3,s_4; s_1=cheak(x-1,y); s_2=cheak(x+1,y); s_3=cheak(x,y-1); s_4=cheak(x,y+1); __int128 ans=min(min(s_1,s_2),min(s_3,s_4)); if(ans==s_1){printf("%lld %lld\n",(x-1+y>>1),(x-1-y>>1));return;} if(ans==s_2){printf("%lld %lld\n",(x+1+y>>1),(x+1-y>>1));return;} if(ans==s_3){printf("%lld %lld\n",(x+y-1>>1),(x-y+1>>1));return;} if(ans==s_4){printf("%lld %lld\n",(x+y+1>>1),(x-y-1>>1));return;} return; } int main() { int i,j; n=rin(); for(i=1;i<=n;i++)a[i].init(); __int128 sum=0; __int128 cts=0; __int128 min_x,min_y; LL x=-1,y=-1; min_x=min_y=0x3f3f3f3f3f3f3f3f; min_x=min_y=min_x*min_x; sort(a+1,a+n+1,myru_x); for(i=1,sum=cts=0;i<=n;i++) { sum+=a[i].x*a[i].t; cts+=a[i].t; if(min_x>cts*a[i].x-sum+(s_x-sum)-(cutt-cts)*a[i].x)min_x=cts*a[i].x-sum+(s_x-sum)-(cutt-cts)*a[i].x,x=a[i].x; } sort(a+1,a+n+1,myru_y); for(i=1,sum=cts=0;i<=n;i++) { sum+=a[i].y*a[i].t; cts+=a[i].t; if(min_y>cts*a[i].y-sum+(s_y-sum)-(cutt-cts)*a[i].y)min_y=cts*a[i].y-sum+(s_y-sum)-(cutt-cts)*a[i].y,y=a[i].y; } work(x,y); return 0; }


__EOF__

本文作者zjjws
本文链接https://www.cnblogs.com/zjjws/p/14126313.html
关于博主:我就是:究极的 Mad Scientist,凤—凰—院—凶—真da!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:这么屑的博主有什么声援的必要吗?
posted @   zjjws  阅读(2374)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示