两个点 (x1,y1),(x2,y2) 的切比雪夫距离为:max(|x1−x2|,|y1−y2|)。
这个东西非常不好处理,因为带最值。
学习了转换切比雪夫距离和曼哈顿距离的方法,而曼哈顿距离和是很好求的。
转换公式为 (x,y)→(x+y,x−y),即可将曼哈顿距离转换为切比雪夫距离。
|x1−x2|+|y1−y2| & max(|x1+y1−x2−y2|,|x1−y1−x2+y2|)
右边那个可以化成:
max(|(x1−x2)+(y1−y2)|,|(x1−x2)−(y1−y2)|)
会发现这个东西和左边等价。
于是,证明成立。
那么返回去倒退即可得到:
切比雪夫转换为曼哈顿:(x,y)→(x+y2,x−y2)。
于是此题便可以得以解决。
这题 x 和 y 要分开做。
由于求得的新坐标虽然是整点,但转变回去并不一定是,于是就可以扰动一下,看一下附近的一些点,找到一个转回去是整点的最小值即可。
但是 WA 了,90 分。
算了一下,这个鬼东西刚好会炸 long long。
于是学会了 int128 的使用方法(
#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 __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__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)