[ABC353F] Tile Distance 题解

1|0[ABC353F] Tile Distance 题解

题目传送门:洛谷, Atcoder

1|1Solution

很恶心人的分类讨论题。

很显然走大格子大概率比走小格子快。

对终点和起点向上下左右枚举大格子,我们就把问题转化为给两个大格子 (a,b)(c,d),求怎样走最快。

对角的大格子可以通过 2 步相互到达,如下图所示。

于是我们可以以以下路径,这是一般情况的最短路径,步数为 max(|ac|,|bd|)。(据说这是切比雪夫距离)

然而当 k2,最后一段路不需要上下横跳,直接横穿小格子即可,步数为 k+12min(|ac|,|bd|)+||ac||bd||

最后要讨论只通过小格子达到的情况,就让上面算出的答案和曼哈顿距离去最小值就好了。

1|0注意:若起点和终点在同一个小格子的块中,答案不一定是他们的曼哈顿距离,就像下图所示的情况,显然红线比绿线短。

1|2code

#include<iostream> #include<vector> #include<algorithm> #include<string> #include<queue> #include<cstring> #include<cmath> #include<cassert> #define pr pair < long long, pair<long long, long long> > #define mp make_pair using namespace std; long long k, sx, sy, tx, ty; long long gt(long long ax, long long ay, long long bx, long long by){ long long a = abs(ax - bx), b = abs(ay - by), ans = max(a, b) * 2, sp = max(a, b) - min(a, b); if(k == 1) return a + b; if(k == 2) return a + b + sp / 2; return ans; } vector < pr > a, b; int main(){ cin >> k >> sx >> sy >> tx >> ty; long long dsx = sx / k, dsy = sy / k, dtx = tx / k, dty = ty / k; long long dis = max(sx, tx) - min(sx, tx) + max(sy, ty) - min(sy, ty); if((dsx + dsy) % 2 == 0){ a.push_back(mp(sx - dsx * k + 1, mp(dsx - 1, dsy))); a.push_back(mp(sy - dsy * k + 1, mp(dsx, dsy - 1))); a.push_back(mp((dsx + 1) * k - sx, mp(dsx + 1, dsy))); a.push_back(mp((dsy + 1) * k - sy, mp(dsx, dsy + 1))); } else a.push_back(mp(0, mp(dsx, dsy))); if((dtx + dty) % 2 == 0){ b.push_back(mp(tx - dtx * k + 1, mp(dtx - 1, dty))); b.push_back(mp(ty - dty * k + 1, mp(dtx, dty - 1))); b.push_back(mp((dtx + 1) * k - tx, mp(dtx + 1, dty))); b.push_back(mp((dty + 1) * k - ty, mp(dtx, dty + 1))); } else b.push_back(mp(0, mp(dtx, dty))); long long minn = dis; for(auto i : a) for(auto j : b) minn = min(minn, i.first + j.first + gt(i.second.first, i.second.second, j.second.first, j.second.second)); cout << minn << endl; return 0; }

__EOF__

本文作者louisliang
本文链接https://www.cnblogs.com/louisliang/p/18199656.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   louisliang  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示